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