Strtokenのバグ?
- このフォーラムに新しいトピックを立てることはできません
- このフォーラムではゲスト投稿が禁止されています
cabin
投稿数: 48
![常連 常連](../../uploads/rank3dbf8e9e7d88d.gif)
以下のようなデータがあると仮定します
'AAAA,BBBB,CCCC'
これを変数Aに代入して
strtoken(変数A,1,',') を実行します。
1番目の値の取得ですので、当然結果は'AAAA'となります。
しかし、変数Aに'AAAA'のみ代入して、
strtoken(変数A,1,',') を実行すると
"Buffer overrun detected!"
となり、uniPaaSが再起動します。
'AAAA,'と代入すれば正常に値を返します。
V9までは全く問題なく値が取得されていたので、
uniPaaSで仕様が変更になったのか、それともバクなのかが不明です。
理由も分からず、2時間くらいはまってしまいました・・・
どちらにしても、現時点ではデータが1つでもトークンを必ず付けないと駄目なようです。
但し、これだけの処理では再現しません。
他にも複合的な原因がありそうなので、上記だけが原因とは限らないようです。
一度投稿すると消せないようなので、追記しておきます。
'AAAA,BBBB,CCCC'
これを変数Aに代入して
strtoken(変数A,1,',') を実行します。
1番目の値の取得ですので、当然結果は'AAAA'となります。
しかし、変数Aに'AAAA'のみ代入して、
strtoken(変数A,1,',') を実行すると
"Buffer overrun detected!"
となり、uniPaaSが再起動します。
'AAAA,'と代入すれば正常に値を返します。
V9までは全く問題なく値が取得されていたので、
uniPaaSで仕様が変更になったのか、それともバクなのかが不明です。
理由も分からず、2時間くらいはまってしまいました・・・
どちらにしても、現時点ではデータが1つでもトークンを必ず付けないと駄目なようです。
但し、これだけの処理では再現しません。
他にも複合的な原因がありそうなので、上記だけが原因とは限らないようです。
一度投稿すると消せないようなので、追記しておきます。
投票数:0
平均点:0.00
05540
投稿数: 19
![新米 新米](../../uploads/rank3e632f95e81ca.gif)
cabinさん、こんにちは。
>他にも複合的な原因がありそうなので、上記だけが原因とは限らないようです。
とのことですが、
> strtoken(変数A,1,',') を実行すると
> "Buffer overrun detected!"
> となり、uniPaaSが再起動します。
となることはなく'AAAA'が取得されました。
Strtokenのバグではなさそうですね。
>他にも複合的な原因がありそうなので、上記だけが原因とは限らないようです。
とのことですが、
> strtoken(変数A,1,',') を実行すると
> "Buffer overrun detected!"
> となり、uniPaaSが再起動します。
となることはなく'AAAA'が取得されました。
Strtokenのバグではなさそうですね。
投票数:0
平均点:0.00
cabin
投稿数: 48
![常連 常連](../../uploads/rank3dbf8e9e7d88d.gif)
uniPaas全体的に言えるのですが、
複合的に挙動がおかしくなる場合があります。
strtokenの件もその1つで、1つの流れの中で使用しているのですが、1つずつ処理を止めていって、最終的にstrtokenの行を止めるとエラーが無くなりました。
しかし、有効にすると"Buffer overrun"が発生するので、
今ひとつすっきりしていません。
しかし、前回も申し上げたように、単体でテストすると全くの正常ということで、問題のプログラムは変数などかなり多くの定義があるので、uniPaas内部のメモリの処理に問題があるのではないかと推測しています。
その他にも、callprog()関数でも妙な動作がありました。
プログラムを追加すると、callprogで呼ばれているプログラムのリテラル番号が変化するはずですが、ごく希に変化しない場合があります。
突然プログラムの挙動がおかしくなったので気づきました。
特に、他のプログラムからプログラムをインポートした際に発生しやすいようです。
プログラムをフォルダ分けして使用していると、読込んだプログラムが途中に挿入されるのが原因かも知れません。
今回の一連の不具合は、V9で数年安定動作しているプログラムをuniPaasにコンバートしたプログラムで発生しています。
"V9Plusアプリケーション変換ユーティリティ"に問題があるのかも知れません。
いろいろと、あれっ?という場面が多いようです。
複合的に挙動がおかしくなる場合があります。
strtokenの件もその1つで、1つの流れの中で使用しているのですが、1つずつ処理を止めていって、最終的にstrtokenの行を止めるとエラーが無くなりました。
しかし、有効にすると"Buffer overrun"が発生するので、
今ひとつすっきりしていません。
しかし、前回も申し上げたように、単体でテストすると全くの正常ということで、問題のプログラムは変数などかなり多くの定義があるので、uniPaas内部のメモリの処理に問題があるのではないかと推測しています。
その他にも、callprog()関数でも妙な動作がありました。
プログラムを追加すると、callprogで呼ばれているプログラムのリテラル番号が変化するはずですが、ごく希に変化しない場合があります。
突然プログラムの挙動がおかしくなったので気づきました。
特に、他のプログラムからプログラムをインポートした際に発生しやすいようです。
プログラムをフォルダ分けして使用していると、読込んだプログラムが途中に挿入されるのが原因かも知れません。
今回の一連の不具合は、V9で数年安定動作しているプログラムをuniPaasにコンバートしたプログラムで発生しています。
"V9Plusアプリケーション変換ユーティリティ"に問題があるのかも知れません。
いろいろと、あれっ?という場面が多いようです。
投票数:0
平均点:0.00
cabin
投稿数: 48
![常連 常連](../../uploads/rank3dbf8e9e7d88d.gif)
自己Resです
やっとStrtokenの問題が分かりました。
問題の処理は、変数に格納された日付文字列を取得する処理で、
V9までのstrtokenは、','が無い場合は、格納されている文字列のみを返していたのですが、uniPaasの場合は、変数の長さ分の文字列を返すのが原因でした。
変数 文字型300byte
文字列
"20110101<space292個>"
V9の場合、"20110101"が返る
uniPaasの場合、"20110101<space292個>"が返る
結果、dstr()に代入すると"Buffer overrun"が発生
受取った値をtrimすると正常に処理されました。
お騒がせしました。
微妙に仕様が変わっているのですね・・・
やっとStrtokenの問題が分かりました。
問題の処理は、変数に格納された日付文字列を取得する処理で、
V9までのstrtokenは、','が無い場合は、格納されている文字列のみを返していたのですが、uniPaasの場合は、変数の長さ分の文字列を返すのが原因でした。
変数 文字型300byte
文字列
"20110101<space292個>"
V9の場合、"20110101"が返る
uniPaasの場合、"20110101<space292個>"が返る
結果、dstr()に代入すると"Buffer overrun"が発生
受取った値をtrimすると正常に処理されました。
お騒がせしました。
微妙に仕様が変わっているのですね・・・
投票数:0
平均点:0.00
05540
投稿数: 19
![新米 新米](../../uploads/rank3e632f95e81ca.gif)
cabinさん、こんにちは。
こちらでも同様な現象が発生しました。
ただ
> 問題の処理は、変数に格納された日付文字列を取得する処理で、
> V9までのstrtokenは、','が無い場合は、格納されている文字列のみ> を返していたのですが、uniPaasの場合は、変数の長さ分の文字列を> 返すのが原因でした。
は、','があっても"Buffer overrun"が発生しました。
"20110101<space292個>"が返ってるんでしょうかね。
こちらでも同様な現象が発生しました。
ただ
> 問題の処理は、変数に格納された日付文字列を取得する処理で、
> V9までのstrtokenは、','が無い場合は、格納されている文字列のみ> を返していたのですが、uniPaasの場合は、変数の長さ分の文字列を> 返すのが原因でした。
は、','があっても"Buffer overrun"が発生しました。
"20110101<space292個>"が返ってるんでしょうかね。
投票数:0
平均点:0.00
cabin
投稿数: 48
![常連 常連](../../uploads/rank3dbf8e9e7d88d.gif)
もしかして、変数に値を設定する際にスペースを残りの数分入れました?
実際は入れていませんので、説明不足でした。
ちょっとテストしてみます。
とにかく取得した値はtrimするのが無難なようですね
実際は入れていませんので、説明不足でした。
ちょっとテストしてみます。
とにかく取得した値はtrimするのが無難なようですね
投票数:0
平均点:0.00
sigeno56
投稿数: 336
![長老 長老](../../uploads/rank3dbf8eb1a72e7.gif)
横入りします。
> とにかく取得した値はtrimするのが無難なようですね
そうですね。私もそうしています。
文字列を何かする時は99% Trim しています。
たまーにRtrimを使う位でしょうか。
じゃなきゃ心配で。
> とにかく取得した値はtrimするのが無難なようですね
そうですね。私もそうしています。
文字列を何かする時は99% Trim しています。
たまーにRtrimを使う位でしょうか。
じゃなきゃ心配で。
投票数:0
平均点:0.00