プレイ日記
ケイン KEIN.HORGAN
シンプルRPG製作日記 7日目 グローバル変数とローカル変数
5そうだね
プレイ済み
返信[1]
親投稿
ケイン KEIN.HORGAN
7日目の今日は前回予告どおり、 「変数は宣言しなくても使えるのに、何故わざわざ宣言するのか」 について説明します。 今回はその説明のために、ちょっと寄り道してプログラムを作成しました。 百聞は一見に如かず、画像のプログラムを考えてみてください。 (実際に打ち込んで実行してみると分かりやすいです)
0そうだね
プレイ済み
返信[2]
親投稿
ケイン KEIN.HORGAN
さて、これを実行するとどうなるでしょうか? COUNT 命令を実行すると2回PRINT 文が実行され、そのCOUNT 文を5回実行しているわけだから、 2*5 = 10回PRINT 命令が実行されるのでしょうか? ■ローカル変数とグローバル変数 先のプログラムでは、一見おかしなところは無いように見えますが…… 実際に実行してみると、プログラムがいつまでたっても終了しません。
0そうだね
プレイ済み
返信[3]
親投稿
ケイン KEIN.HORGAN
何故かというと、ループ変数である I に問題があります。 ループが終了する条件は、NEXT が実行されてI が1増えた時に、その値が TO で指定された値より大きくなっている事でした。 つまり、I=0 TO 4 なら、NEXT が実行された時に I=4 から I=5 になればループ終了。 I=0 TO 1 なら、NEXT が実行された時に I=1 から I=2 になればループ終了。 ということになります。 さて、ここでCOUNT 命令を見てみます。 FOR I=0 TO 1 ~ NEXT となっているので、このループが終了した時は、I=2 になっています。 ループが終了した後、END 命令があるので、ここで自作命令は終了。 つまり、COUNT 命令を実行すると、I=2 になるわけです。
0そうだね
プレイ済み
返信[4]
親投稿
ケイン KEIN.HORGAN
さて…… ここで最初の4行を改めて確認すると、 FOR I=0 TO 4 ' I=4までループさせる。I=5 になったらループ終了 ?I;"かいめ" COUNT ' COUNT 命令を実行すると、I=2 になる NEXT ' Iの値を+1して、I=3 になる という動作になる事がわかります。 COUNT を実行するとI=2 になるわけなので、4行目のNEXT の時は、何回繰り返しても I=2 から I=3 になるだけです。 ループ終了させるには、I=5 にならないといけないのに、どんなにループしてもI=3 にしかならないので、このループはいつまでたっても終了しません。無限ループします。
0そうだね
プレイ済み
返信[5]
親投稿
ケイン KEIN.HORGAN
この問題を解決しようとした時に、すぐに思い浮かぶのは、 「Iを二つのループで使うからいけない。どちらか片方、Iじゃない変数でチェックすればいい」 という方法です。 実際にこれは間違いではなく、例えばCOUNT 命令でのループを DEF COUNT FOR J=0 TO 1 PRINT J NEXT END とでもすれば、問題なく終了します。 しかし、この方法は「この変数は別のところで使っていないかな?」と常に確認しないといけなくなり、少々面倒です。
0そうだね
プレイ済み
返信[6]
親投稿
ケイン KEIN.HORGAN
そこで出てくるのが「ローカル変数」という仕組みです。 「ローカル変数」とは、この場合は「自作命令の中だけで有効な変数」という意味になります。 (仮に、同じ名前の変数が別の場所にあっても、別物として扱う事ができます) そして、このローカル変数は、自作命令内で、「DIM」で宣言する事で使用する事ができます。 つまり、
0そうだね
プレイ済み
返信[7]
親投稿
ケイン KEIN.HORGAN
FOR I=0 TO 4 COUNT NEXT DEF COUNT DIM I FOR I=0 TO 1 PRINT I NEXT END
0そうだね
プレイ済み
返信[8]
親投稿
ケイン KEIN.HORGAN
とした場合、最初のループで使っている変数 I と、COUNT 内で使っている変数 I は別物になります。 そのため、いちいち「この変数は別のところで使っちゃってないかな?」と気にする必要がなくなります。 ※ローカル変数を使う場合の注意として、「ローカル変数は毎回リセットされる」という点がありますので、その点は注意が必要です。
0そうだね
プレイ済み
返信[9]
親投稿
ケイン KEIN.HORGAN
なお、プログラムのどこであっても同じ変数として扱うものを「グローバル変数」と呼びます。 自作命令の中で、グローバル変数のまま使うか、ローカル変数のまま使うかは時と場合によりますので、使いやすい方を使う事になります。 ※今日はここまでです。 次回は、プログラムの整理(オープニングイベントとメッセージ欄クリア機能を自作命令化)した上で、主人公の上下左右移動機能を実装しようと思います。
0そうだね
プレイ済み