プレイ日記
質問です。頭の中では上手くいくはずなのに() 変数DAT$の中身を保護したいので、69行目でDAT3$に入れて、その変数をshiftすると、両変数どちらもshiftされていました。原因がわかるかたどうか助言を………
5そうだね
プレイ済み
返信[1]
親投稿
はる HARUHI-0913
詳しい原因は自分には分かりませんが、 「=」で変数をそのまま代入するとそうなることがあるそうです。
0そうだね
プレイ済み
返信[2]
親投稿
ダニィ!? バグか?仕様か?
0そうだね
プレイ済み
返信[3]
親投稿
参照かな
3そうだね
プレイ済み
返信[4]
親投稿
参照とは……?
0そうだね
プレイ済み
返信[5]
親投稿
参照 ざっくりいうと、変数名が違っても同じメモリの場所を読み書きする状態
1そうだね
プレイ済み
返信[6]
親投稿
はる HARUHI-0913
Javaなどには「参照値」というものがあるそうです。 プチコンのこの現象は、それに似ているんだそうです。
3そうだね
プレイ済み
返信[7]
親投稿
はる HARUHI-0913
1つの箱に2つ以上の名前がある状態みたいなもんだと思います。
2そうだね
プレイ済み
返信[8]
親投稿
文字列または配列を DEFの引数で渡したとき 変数=変数したとき に起きるはず 後者は何か計算を行うことで回避できる(1を掛けるのがお手軽)
2そうだね
プレイ済み
返信[9]
親投稿
はる HARUHI-0913
「プチコン3号 SMILE BASIC 公式ムック (日経BPパソコンベストムック)」という本の67・68㌻にそのことについて書かれています。 自分は説明が下手なので、 それを見た方が分かりやすいと思います。
3そうだね
プレイ済み
返信[10]
親投稿
なるほど!ありがとうです!
1そうだね
プレイ済み
返信[11]
親投稿
SquidSky ugomemo_gorohati
あ!よく気が付いたね!(( プチコンはJavaとは似ていませんが変数参照については、特に配列では変数参照に注意が必要です。 【変数参照とは】 A$="A" B$="B" A$=B$ PRINT A$ B$="C" PRINT A$ これと同じです。最初にA$にB$の内容を代入しています。しかし、それはパソコンの「B$へのショートカット」にすぎず、完全なコピーになりません。 そのため、B$の内容を置き換えるとA$の内容も変わります。
2そうだね
プレイ済み
返信[12]
親投稿
Godot orz_127
配列の代入で添え字指定なしの場合は参照値渡し、Cで言うとポインタ、VBか何かだとByRefのような感じになるらしいです。 DIM A[0],B[5]:A=B:B[4]=10:?A[4]とすると10が表示されるはず。 文字列も内部的には配列と同じようになっているらしく、配列用のコマンドとか関数が使えます。 文字列は気をつけないと思わぬ所で参照渡しに^^; なのでDAT3$の代入のところは、COPYコマンドを使うか、「DAT3$=" "+DAT$」として回避するとよいかと。 ↑でよいばずだけど、今、試していないので間違いだったらすみません。
3そうだね
プレイ済み
返信[13]
親投稿
参照のしくみはこんな感じ。 変数に覚えた値は3DSのメモリに覚えています メモリは方眼紙のようにたくさんのマスがあって、その中の1マスで1つの変数の値を覚えています。 配列の場合は DIM A[10]と定義したら10マス分値を覚えます。 この値を覚えるメモリとは別に、変数がどのメモリの位置に値を覚えているかもメモリに持っています。 これが変数の参照情報です。 たとえば変数A は方眼紙の100個目というような参照情報があって、 A=20 とすると、方眼紙の100個目に 20 という値を覚えます。 このとき方眼紙の100個目という情報はプチコンを使うときにはまったく意識しなくて良い情報なので、この100個目という情報は確認できません。 (つづく)
2そうだね
プレイ済み
返信[14]
親投稿
ここで DAT3$=DAT$ について、DAT$の値はすでにメモリに存在していて、参照情報もDAT$ 用のものがあります。 DAT3$=DAT$ としたときに、DAT3$ のメモリに値がコピーされるのではなく、DAT3$ の参照情報がDAT$ と同じものにかわります。 そのあとの配列操作命のSHIFT でDAT3$ を操作すると、DAT$ と同じメモリの値を参照しているので、結果的にDAT$ の値もDAT3$ の値も SHIFTされます。 これをしないようにするには、DAT3$ とDAT$ のメモリの値を別々に確保しなくてはいけません。 配列操作であれば COPY を使って配列をコピーするのがいいと思われます。
2そうだね
プレイ済み
返信[15]
親投稿
たかChi takashi_o
配列参照渡しとSPANIMは初心者への洗礼。
3そうだね
プレイ済み
返信[16]
親投稿
変数のしくみを覚えるときに「箱に変数の名前をつけて覚える」というように習うことが多いです。 参照を考える場合はこの考え方だとわかりづらくて、変数のしくみは「番号が書いた箱がたくさんあって、それとは別にカードがたくさんあって、1枚のカードに変数の名前をつけて、そのカードに何番目の箱かが書いてある」という感じになります。 プチコン以外の言語もだいたいそんな感じで変数の管理がされています。
3そうだね
プレイ済み
返信[17]
親投稿
ためになりました…!
2そうだね
プレイ済み
返信[18]
親投稿
SquidSky ugomemo_gorohati
【まとめ】 配列の内容を保護したりバックアップする場合は、転送先の配列へCOPY命令を使うと参照元に左右されず値を保持できます。 VAR A[4],A_BKUP[4] FOR I=0 TO 4 A[I]=10+1 NEXT COPY A,A_BKUP A[0]=444 PRINT A_BKUP[0] これを実行すると、コピー後にAの0番目の値が書き換えられますが、A_BKUPの0番目の内容は変わりません。
2そうだね
プレイ済み