トピック
受付中

READとDATAについて

2つ組み合わせて使うと思うのですが、使い方が分かりません。 説明読んでもいまいち分かりませんでした。 それぞれどう使うのか教えてほしいです。
7そうだね
未プレイ
返信[1]
親投稿
DATAで記述したデータをREADで変数に格納出来ます。 例 READ A,B,C 'Aに216Bに256Cに267が格納される ?FORMAT$("A=%dB=%dC=%d",A,B,C) DATA 216,256,267 実行結果 A=216B=256C=267 OK
2そうだね
プレイ済み
返信[2]
親投稿
say sayer.exe
何が理解できないのかがわからないな read foo data 1234 で、fooの値が何なのかわかる?
3そうだね
プレイ済み
返信[3]
親投稿
返信ありがとうございます! こういち s>変数代入はDATAのところでですか? say s>1234だと思いますが、どこで代入してるのか分かりません
1そうだね
未プレイ
返信[4]
親投稿
だにえる haru2016nen
代入する命令(=と同様の役割を果たすもの)は 色々あるけど、 例として「INPUT N」を挙げると 「変数Nに、キーボードから受け取った値を代入する」という命令。 つまり、「N=キーボードから受け取った値」 という風に解釈出来る。 これと同様に「READ N」も「N=値」。 READの場合は特殊で、 DATAに記述された値を代入するというもの。
3そうだね
プレイ済み
返信[5]
親投稿
だにえる haru2016nen
一度に複数のデータを代入することも 可能で READ A,B,C,D DATA 0,2,5,9 とすると 「 A=0 : B=2 : C=5 : D=9 」 を略した形になる。 DATAも特殊でプログラム内に 存在していれば、記述している箇所が READより上であれ下であれ (コメントアウトは有効) データとしてみなされる。 例「DATA 1 : READ N」と  「READ N : DATA 1」は同じ。
2そうだね
プレイ済み
返信[6]
親投稿
だにえる haru2016nen
DATAとREADの特徴は 「DATAにより情報をまとめて記述できて、 コピー等によって簡単に他のプログラムにも 流用出来る」とか色々。 有効活用法として例としてゲームなら、、、 キャラクターのデザイン、 ゲームバランス調整のための数値(体力、攻撃力等) とかをDATAの箇所をいじるだけで すぐに変更出来るということ。 (=で代入している部分をいちいち探すのは 手間が掛かる) 色んなプログラムを作っていけば ここだ!っていう有効活用出来そうな 状況が出てくるだろうから、色々と試していくといい。RESTOREという命令も併せて覚えておくといいかも。
2そうだね
プレイ済み
返信[7]
親投稿
ツララ LongIceSword
例えば READ N DATA 1,2,3,4 とすると単に N=1 と同じ処理になるんですが、READ命令とDATA文の真価が発揮されるのはループ処理の中で繰り返す事でN=1がN=2やN=3に変化させれるって事なんですな。 だにえるさんが説明してくれてますけど、RESTORE命令とラベルを組み合わせる事で読み込むデータの位置を操作出来るので プログラム中で使う定数の使い回しが楽になったりもするんですな。
0そうだね
プレイ済み
返信[8]
親投稿
ツララ LongIceSword
合わせてプログラム操作系とスロット操作系の命令で新しくDATA文を別スロットに書き出したりすると 読み込むDATA文を予めプログラム中で用意する事無くプログラム中で作成や更新とかも出来たりするんですな。
1そうだね
プレイ済み
返信[9]
親投稿
プチコンの規則的には変数に値を返すのはOUT構文なんだけど READっちゅうのはその規則の例外なんだよね だから見た目から分かりにくくなっちゃてる… 古いBASICがそうだったので仕方がないというか… READ OUT 変数 って書き方も許容してほしいと思う
4そうだね
プレイ済み
返信[10]
親投稿
返信ありがとうございます! 塾から帰ってきたら読ませて頂きます
1そうだね
未プレイ
返信[11]
親投稿
READ "変数名" だったら誰も文句を言わなかったのに。
2そうだね
プレイ済み
返信[12]
親投稿
READとDATAの関係は分かったんですが、 READ A,B,C,D DATA 1,2,3,4 DATA 5,6,7,8 となった場合、 A=5,B=6,C=7,D=8 になるんですか?
1そうだね
未プレイ
返信[13]
親投稿
えくる sixtie
一回目はA=1,B=2,C=3,D=4 もう一回動くとA=5,B=6,C=7,D=8 READするごとにどんどん先に進むと思うといいよ。
1そうだね
プレイ済み
返信[14]
親投稿
では、 A=5,B=6,C=7,D=8 の次にもう一度ループしたら A=1,B=2,C=3,D=4 に戻るんですか?
1そうだね
未プレイ
返信[15]
親投稿
えくる sixtie
いえ、さいごまで読んでいてさらに読もうとするとエラーになります。
1そうだね
プレイ済み
返信[16]
親投稿
分かりました! でもまた分からなくなるかもしれないので、その時はお願いします。
3そうだね
未プレイ
返信[17]
親投稿
ツララ LongIceSword
ループ処理でREAD命令とDATA文を使う時の制御は[DATA文中で「,」で区切られた要素の総数]÷[READ命令で一回に読み込む変数の個数]=[ループ回数]なので 予め一つのDATA文に記述する要素数は幾つまでっていうのを決めておくと制御が楽になりますよ。 一度に複数の変数を読み込まず一個ずつ読み込むのなら、読み込み終了判定用の数値を決めておいて(-1とか)、IF文と組み合わせてRESTORE命令でDATA文の読み込み位置をリセットするか他のラベルに移動させるとかすればエラー回避できますけど。 何にせよDATA文を使う時はラベルとセットで使うと便利ってことですね。
1そうだね
プレイ済み
返信[18]
親投稿
MNC2 Monaca-kun2
ぶっちゃけ、DATAやREADを使わなくても A=1 B=4 C=6 D=10 E=5 F=8 みたいな書き方しても、それはそれで構わないと言えば 構わなかったりします。DATAとREADが生きてくるのは もっと大量のデータを扱いたい時ですから。 それより、READで読み出したい場合は配列を使うと便利ですよ。
0そうだね
プレイ済み
返信[19]
親投稿
ラベルと併用ですね!覚えておきます! DIM命令はよく分かっていないので...^^;
0そうだね
未プレイ
返信[20]
親投稿
ツララ LongIceSword
変数の中身を切り替えたいだけならREAD命令とDATA文を使わずに、サブルーチンでMNC2さんの様にやっちゃっても構わないちゃ構わないんですけども (初期化処理とかで自分もよくやりますやります) DATA文を一連の記録テープみたいなものとして見てみると、プログラム中でどういう順番で書いておくかっていうのも工夫のしがいがあったり。 その場合、ラベルは頭出しのための目印みたいなものになりますね。 DIM命令はVAR命令と同じで、そのプログラム中で配列を使える様にする命令ですね。 COPY命令とかと合わせて使う時に必要になりますね。 >sayさん 上手く説明されないと分からないのが分からないんです? 上手い説明の仕方も練習しないと身に付かないですよ?
0そうだね
プレイ済み
返信[21]
親投稿
正確に言うと[DIM命令は分かっていない]ではなくて[配列変数の使い方が分からない]でしたm(_ _)m DIM A[1] でA[0]とA[1]が作られるのは分かるんですが、A[0]をどう使えばいいのかが分かりません...
0そうだね
未プレイ
返信[22]
親投稿
>DIM A[1]でA[0]とA[1]が作られるのは分かるんですが< 少し言いづらいのですが、DIM A[1]で作られるのはA[0]のみです。A[0]とA[1]が作られるように宣言するには DIM A[2] と宣言する必要があります。(宣言するときに[]の中に入れた数字の1個前まで作られると覚えれば良い。)
0そうだね
プレイ済み
返信[23]
親投稿
配列は画面写真のように大量のデータを扱うときに使います。 例えば DIM A[10] という配列を宣言したときに A[0]~A[9]が作られます。 ここまでは分かりますね? で、作られた変数は A[0]=10 という風に普通の変数と同じように扱えます。
0そうだね
プレイ済み
返信[24]
親投稿
あ、DIMって1つ前までの数しか作られないんですね... 覚えておきます! 通常の変数と同様の動作ってことは DIM A[1] A[0]=1 WHILE A[0] WEND でループになるんですか?
0そうだね
未プレイ
返信[25]
親投稿
当然ループになります。 そして WHILE A[0]  IF RND(2048)==0 THEN A[0]=0 WEND みたいにループ内でA[0]の値を0にすればループから抜けられます。(ただし、あまり賢いやり方とは言えません。WHILE 条件にすれば良いので。)
0そうだね
プレイ済み
返信[26]
親投稿
じゃあ、考え方としては VAR A0:VAR A1=DIM A[2] ですか?
0そうだね
未プレイ
返信[27]
親投稿
配列は「 DIM 配列変数名[個数] 」で定義することができて 「 配列変数名[番号] 」を変数名として使えるのです。 DIM A[10] と定義すると A[0] を変数名として使えます カッコがあるけどそれが変数名として使えます このカッコの中の数値は別の変数にしても使えるので DIM A[10] I=3 A[I]=999 という感じでも使えます VAR A0: VAR A1 とどんどん書いて行くのが大変なのと、番号に別の変数が使えるという理由で DIM A[2] として配列にしたほうが便利なのです。
0そうだね
プレイ済み
返信[28]
親投稿
READとDATAには、実は「読み込むDATAの位置」というのが内部でこっそり存在しています。 READ は 1回実行するごとに、「読み込むDATAの位置」にある DATAの値を1つ読み込んで、「読み込むDATAの位置」を次のDATAの値にします これによって次のREADは次のDATAの値が読めます(「次のDATA」ではなく「次のDATAの値」です) ちなみに「読み込むDATAの位置」は起動時は最初のDATAの値で、RESTORE 命令でラベル位置に変更できます コレを踏まえて、配列と組み合わせるとこんなことが出来ます。 READ N DIM A[N] FOR I=0 TO N-1 READ A[I] NEXT DATA 10 '個数 DATA 9,8,7,6,5 DATA 4,3,2,1,0
0そうだね
プレイ済み
返信[29]
親投稿
say sayer.exe
合ってます その考え方でA0~A10と言う変数を定義してみるとわかると思いますが、 VAR A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10 となるのに対して 配列では VAR A[11] と、こんだけで済みます ☆わからないならA0~A1000を定義してみよう 配列もDATA文も、マップ(RPGなどにあるマップのことね)を描くようになれば、けっこうすんなり飲み込めるよ
0そうだね
プレイ済み
返信[30]
親投稿
皆さんありがとうございます! DIMはもっと複雑だと思っていたので、ただの変数として使えることにビックリです!w でも、DIMとDATAってどっちの方が複数の変数を一気に作るときに便利なんですか?
0そうだね
未プレイ
返信[31]
親投稿
ツララ LongIceSword
どっちの方がって言うか、入れ物と内容物の関係だからセットで考えた方がいいかと。 ただCOPY命令とかを使う場合は、入れる物の個数に合わせて自動的に箱の数を調整してくれるだけで(箱の数が足りない場合のみ) ちゃんと自動処理の仕組みを理解してないとバグの原因になったりするから 興味があるならPUSH命令やPOP()命令とか配列のサイズ操作系命令も合わせて、もし手動で処理するとなるとどういう事になるのかを調べてみるといいかも。
0そうだね
プレイ済み