Petitverse
ゲストさん (
ログイン
)
ログイン
コミュニティ内検索
コミュニティ一覧
Petitverse ご利用ガイド
Petitverse からのおしらせ
プチコン 非公式コミュニティ
トピック
しんいち
◆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」など、
プチコンシリーズ
に関する話題を扱った
コミュニティです
プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
ユーザー登録なしで書き込みができます
秘密の合い言葉は成りすましの防止 (
トリップ機能
)、書き込みの編集時の本人認証に使用します
秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります
normal
happy
like
surprized
frustrated
puzzled
画像
ネタバレ
投稿する
-
WEB PATIO
-