コミュニティアイコン プチコン 非公式コミュニティ トピック

アバター
しんいち ◆lHy.hAWXbthn
2018/4/12 21:33
情報交換
[バグ]DEF内での文字列操作
プログラムはPUSHで追加した文字列をLEFT$で削除(つまり何も変わらないはず)しているだけなのですが、それをDEF内で行うと、何故かおかしなことになってしまいます。3号とBIG両方で現象を確認しており、恐らく今回のアップデート(Ver3.6.0)からのバグだと思われます。

コメント

アバター
しんいち 2018/4/12 21:41 ◆lHy.hAWXbthn
実行結果。全て 3 BUG が出力されて欲しいところ。
そして気持ち悪いことに、2つ目のPRINT文をS(M$)の手前で2行に分けると、また結果が変わってきます。
#かなり危険な香りの漂うバグだなぁ(~_~;)
アバター
しんいち 2018/4/12 21:57 ◆lHy.hAWXbthn
回避策。
DEF内の
V=LEFT$(V,L)

V[L+1]="":V[L]=""
に代えると期待通りの動作になります。
アバター
こういち 2018/4/12 22:03 ◆ou0jbJnEJ0Kb
LEFT$って参照型でしたっけ?
アバター
こういち 2018/4/12 22:18 ◆ou0jbJnEJ0Kb
文字列の参照について
文字列を直接書き換えた場合のみ(つまり配列として扱った場合)参照先も書き変わります。
SUBST$()やFORMAT$()などで編集した文字列を代入した場合、参照先はそのままです。
わりと面倒な仕様。
アバター
しんいち 2018/4/12 22:37 ◆lHy.hAWXbthn
参照型であっても、変更後の文字列を変更前の文字列に代入している(V=LEFT$(V,L))ので、変更されなきゃおかしいと思うんですよね。それにDEFの外ならちゃんと動いてるのにDEFの中だとおかしい、というのも納得行かないし。
アバター
こういち 2018/4/12 22:37 ◆ou0jbJnEJ0Kb
ついでにもういっちょ。
一つの式の中で関数は右から評価されます。
この場合S()が評価されて、LEN()が評価されて、最後にPRINTが実行されます。
アバター
こういち 2018/4/12 22:44 ◆ou0jbJnEJ0Kb
Vはあくまで
「M$と同じアドレスを指し示している」
だけであって、VとM$は別物です。
V=文字列

「その文字列が指し示すアドレスを新しく参照しなおす」(つまり指し示す場所を変えただけ)
という意味と捉えると辻褄が合う。
アバター
でんぺん 2018/4/12 22:52 ◆HfSy5ayxtyTa
こういちさんの解釈が合ってそうな気がしますね。つまりDEFの中の
PUSH V,"!?"
まではVはM$を参照しているので同一のものとして処理されていますが、
V=LEFT$(V,L)
のところでVのM$への参照はなくなってVという変数に独立するので、M$には影響を与えずM$は5文字のまま変化しなかったって感じですね。
アバター
しんいち 2018/4/12 23:19 ◆lHy.hAWXbthn
あ〜、解ってきた。
10行目、11行目は
PUSH M$,"!?"
V=LEFT$(M$,L)
って考えると辻褄が合うのか。LEFT$のところで参照が切れてるんだな。
でもこれって、前(Ver3.5.2)からこうだったのかなぁ?
前は11行目も M$=LEFT$(M$,L) だったような気がしたんだけど
気のせいだったか。

何故そう思うのかと言うと、前に作ってた関数がそうなってたので。
でももしかしたら前からその関数ちゃんと動いてなかった、という可能性も^^;

コメントを書く

  • こちらは「プチコン3号」「プチコンBIG」など、プチコンシリーズに関する話題を扱ったコミュニティです
  • プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
  • こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
  • ユーザー登録なしで書き込みができます
  • 秘密の合い言葉は成りすましの防止 (トリップ機能)、書き込みの編集時の本人認証に使用します
  • 秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
  • 書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります

- WEB PATIO -