投稿
Godot orz_127
前のプログラムが動かなくなった原因を探していて文字例のINCの動作の変更かな?というところにさっき行き着いたのですが…。 今手元に3.0.2がないので確認できず…。 旧3DS持って来れば良かった^^;
4そうだね
プレイ済み
返信[1]
親投稿
りゅうまご ryumago2nd
試してみました 次のコメントで実行したソースを乗せておきます コメント以外は一致してるはず
0そうだね
プレイ済み
返信[2]
親投稿
りゅうまご ryumago2nd
実行したソースです
0そうだね
プレイ済み
返信[3]
親投稿
これは、一応バグとしてあげた方が良いのかもしれませんね(^^;) エラーにならずに予期せぬ動きになってる可能性もあって怖いですしね
0そうだね
プレイ済み
返信[4]
親投稿
れい rei-nntnd
静的文字列の処理をミスったみたいですね Incがだいぶ速くなったから喜んでたら落とし穴 はやくアプデこないかなー
0そうだね
プレイ済み
返信[5]
親投稿
Godot orz_127
>りゅうまごさん 検証ありがとうございます。 やはりこれか…。 バグった関数の処理を削りまくったらここに到達。 関数への文字引き渡しはたしか参照渡しだと思ったので一旦COPYする必要があると認識していましたが、 関数だったので必要ないところだった筈なのに…。 処理を速めるためにINC内のCOPY処理を削ったのでしょうか? だとすると仕様変更でバグとはならない気が…。 だとするとアプデには期待できなそうな^^; VAR S$="…" INC S$,"…" 桁か揃って綺麗なので多用している…。 全部直すのか?! orz
0そうだね
プレイ済み
返信[6]
親投稿
私も結構使っている箇所があるような(^^;) 短く書けるので重宝してたんですよね
0そうだね
プレイ済み
返信[7]
親投稿
Godot orz_127
とりあえず、こちらでも 3.0.2で確認してみました。 りゅうまごさんに検証していただいたとおりでした。 1行が50桁しかないので 文字列に結構INCを多用してしまっています。 さて困ったこれからどうしよう。 アプデで「+=」とか実装してくれないかな^^;
1そうだね
プレイ済み
返信[8]
親投稿
Oskar oskar_liebig
SmileBASIC 3.0~ の文字列変数のコピー A2$=A1$ が浅いコピー(参照のコピー)だということが問題の根にあると思います。普通 BASIC の文字列変数のコピーは常に深いコピー(中身のコピー)なので、こういうことは発生しません。 逃げ道としては、文字列変数を直接代入しないで A2$=A1$+"" のように空文字列を連結してから代入すれば、INC A2$,"#" としても A1$ が変更されなくなります。 ※3.0.2まで INC/DEC の先頭引数が2回評価されていた※のですが、3.1.0では1回になったようです。この変更(修正?)の影響を受けたのかもしれません。 ※ 例えば INC A$[FUNC()],"#" と書くと FUNC() が2回呼ばれていた
0そうだね
プレイ済み
返信[9]
親投稿
Godot orz_127
>Oskarさん 情報ありがとうございます^^ 空文字を足す件、以前どここかのコメントで関数の引数が参照渡しなのでこれと同様な現象になるという話題があて、その対処のひとつとしてこの方法があがっていました。 もうひとつは、引数をCOPYして文字列を別オブシェクト化する方法でした。 てっきり処理速度改善のために、INC内で行われていたCOPY処理を省略する様に仕様変更されたせいかな?とも思っていましたが…。 INCには先頭引数が2回評価される不具合?みたいなのもあったんですね。 たまたまそれで上手く動いてみえてたのかな^^;
0そうだね
プレイ済み