コミュニティアイコン プチコン 非公式コミュニティ プレイ日記

アバター
XOR ◆jrp9IErPrDPr
2023/5/3 21:15
txtA$="ABC"
txtB$=txtA$
FOR I=0 TO 2
txtA$[I]="X"
NEXT
PRINT txtB$


これを実行すると「XXX」と表示されたのですが、
最初にtxtB$に"ABC"を代入した以降はtxtB$を書き換えていないのに
txtB$がtxtA$と同じように書き換わってしまっているのですが、これは仕様でしょうか?教えて欲しいです

コメント

アバター
こういち 2023/5/3 21:23 ◆ou0jbJnEJ0Kb
はい。
参照と言います。
文字列は非常にサイズが大きい(1文字ごとに2バイトかな)ので、変数は文字列そのものではなく、文字列の場所(アドレスと言います)を持っています。
txtB$=txtA$
では文字列そのものをコピーするのではなく、アドレスを代入することになります。(つまりtxtB$とtxtA$の指し示す場所が同じになる)

参照を回避するにはCOPYという命令を使います。
アバター
あまさとしおん 2023/5/3 21:29 ◆mzDKTVUAtwqE
なお面倒なときはtxtB$=””+txtA$
などと書く回避法もあります(右辺が変数1個だけだと参照になるから式にすればおkと考える)
アバター
こういち 2023/5/3 21:32 ◆ou0jbJnEJ0Kb
なんならtxtB$=””+txtA$の方が望ましいかもですね。(COPYは少し罠がある)
アバター
XOR 2023/5/3 21:38 ◆jrp9IErPrDPr
なるほど〜
教えて頂きありがとうございました

かつてこの仕様を理解していなかった所為でめっちゃゲーム制作に苦労したことがあったもので...
アバター
XOR 2023/5/3 21:43 ◆jrp9IErPrDPr
「別の配列に元の文字列を1文字ずつ入れておく」とかいうかなり無理やりな手段を取ってました()
アバター
こういち 2023/5/3 21:52 ◆ou0jbJnEJ0Kb
あぁ…ちなみに配列でも参照は起こります。(しかも実数配列,整数配列,文字列とか関係なしにtxt#=a%とか出来てしまう)
配列と文字列はわりと同じ扱いなので、一文字ずつ代入するのは内部ではCOPYと同じだったり。

コメントを書く

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

- WEB PATIO -