第2回 とりあえず、ゲームでも「2.変数を使う」

2−2 変数を使う

 さて、変数を続けます。
名前と種類が決まった変数には「値を入れたり」「参照」したりできますが、このような動作は、以前に見かけませんでしたか?
そう、第1回で"Hello,world!"という文字列をプロパティに代入したり、その値を使ったりする動作を既に実習してきました。
そのプロパティのときと同様に「=(イコール)」を使って、変数に値を「代入」することができます。
例えば、

   Dim Score as Integer
   Score=1000

という具合に記述します。代入は「右の値が左へ」でしたね。
値が文字列の場合もプロパティと同様、""(ダブルクォート)で囲んで取り扱います。

   Dim MyName as String
   MyName="mizuno-ami"

参照するときは、変数名を使います。
例えば、

   Dim A as Integer
   Dim B as Integer
   A=10
   B=A+100

とすると、Aには10が代入されます。BはAの値と100を足した結果が代入されますので、結果110になります。特に何もすることはなく変数Aをそのまま数式内に記述するだけです。

続いて「有効範囲がある」と言うことですが、これは、実際のプログラムを見ながらの方がわかりやすいですね。
ボタンを2つ貼った、次のようなサンプルを作ってみましょう。

  

1つ目のボタン(Button1)は、
      Dim A as String
      A="Hello!"
      MsgBox A
2つ目のボタン(Button2)は
      Dim A as String
      MsgBox A
とします。 では、ボタン1をタップしてみましょう。
ちゃんと、Hello!と表示されましたね。次にボタン2です。
何も表示されませんでしたね。
1つ目で変数Aには、Hello!と代入しておいたのですが、2つ目では表示されませんでした。

     
  左.ボタン1タップ時、右.ボタン2タップ時

ボタン2をタップしたとき、Dimで宣言してるから初期化されてるんじゃない?と思った方、そうです、正解です。
変数の宣言をすると、数値変数は0に、文字変数は""の「初期値」がセットされます。そのため、初期化されて何も表示されないわけですね。
では「初期化しなきゃ、ボタン1で代入した"Hello!"が表示されるのでは?」と思われるかも知れませんね。しかし、2つ目のボタンから、Dimを抜いてコンパイルすると、コンパイルエラーになります。

基本的に、Dimで宣言した変数は、Sub 〜 End Subの間だけで有効で、その外からは代入や参照することができません。とても、ローカルな状態であると言えます。
ある変数に代入したり参照したりできる範囲、つまり見える範囲ですが、その範囲のことを変数の「スコープ」とも言います。
Dimで宣言した変数は、そのSubモジュール内だけで使えますから、とてもローカルなスコープであると言えます。 そうすると、結果的にボタン1の変数Aとボタン2の変数Aは名前は同じなのですが、全く違うものとして取り扱うことができるわけです。

一方、プログラムの中で始めから終わりまで、同じ値を取り扱いたいことがあります。例えば、ゲームの点数ですが、ボタンをタップする度に初期化されては、ゲームになりませんね。
こう言う場合は、Dimで宣言せず「Global」(GLOBAL)というコマンドで宣言します。
Globalコマンドで定義した変数は、プログラム中のどのSub内でも代入したり参照することが可能になります。

例えば、先ほどの例で、ボタン1の宣言部分を

    Global A as String

にして下さい。
そして、ボタン2からDim文を削除してコンパイルします。するとエラーが出ず、さらに、ボタン1→ボタン2の順にをタップすると"Hello!"と表示されます。
Dimで宣言していた変数のスコープがローカルであったのに対し、Globalで宣言した変数はまさに「グローバル」なスコープになります。 ちなみに、VBAなどではGlobalと同様、Publicという言葉を使います。

一方、ボタン2からDim文を削除しない状態でもエラーは出ません。
これは、スコープの優先順位があり、Globalで宣言したものより、Sub内で宣言したローカルな変数の方が高い優先順位を持っています。
したがって、ボタン2からDim文を削除しない場合は、ローカル変数Aが宣言され、初期値""が表示されます。

ここで、1つ発見したことがあります。
変数は、宣言をしてからしか使えませんので、Global宣言にしてもボタン1→ボタン2の順番でタップしないと動作しないと思っていましたが、Globalで宣言したものは例外でした。
私は、この原稿執筆時に、ボタン2→ボタン1の順にタップしたら、Aを宣言していないので正常に動作せず、ハングアップすると思ってましたが、NS Basicでは通るようです。ただし、"Hello!"表示されず、初期値の""でした。
(バグかなぁ・・・)

    

変数には、値を代入したり参照したりする機能があります。ま、入れ物ですからね。
そして、その入れ物が見える範囲、スコープと言うモノがあり、ローカルか、グローバルかで取り扱いが変わることを理解できたでしょうか。

前へ     目次へ     次へ

第2回 とりあえず、ゲームでも「2.変数を使う」