第4講 ブロック崩しその2(ボールを動かして壁にぶつかると反射するようにするまで)
第8話 箱(変数)の使える範囲
先に進みたいでしょうが、
箱の適用範囲について説明しなければなりません。
C言語はプラモデルが部品から組み立てるように、
独立部品から組み立てるのだという話しをしました。
どうしてわざわざ独立をいっているのかに関する話しですし、
C言語王道を歩んできた理由の話しでもあります。
とても重要な話題です。
では、皆さんゲームのソリューションを閉じて、
第4講第1話で開いたプロジェクトConsoleApplication1
をもう一度開いてください。
ソリューションは
ファイル→ソリューションを閉じる
で閉じることができます。

プロジェクトConsoleApplication1を開いたら、
コードを
#include<stdio.h>
void f(); //社員f()を雇う
int main()
{
  int a = 0,i = 1;
  f();
  printf("1+2+3+4+5+6+7+8+9+10 = %d\n", a);
  return 0;
}
void f() { //1から10までの和を計算する社員
  while (i>0) {
    a = a + i;
    i++;
    if (i > 10)break;
  }
}
コピペ用添付ファイル

としてください。
これは、業務
  while (i>0) {
    a = a + i;
    i++;
    if (i > 10)break;
  }
を新たに採用した社員に担当させようとしているのです。

この段階で、
009
iとaのところに赤い波線がでいます。
実は、Visual Studio Community 2017
が波線のところに問題があることを指摘しているのです。
実際に、Ctrl+F5をしてみると、
008
と7つのエラーが指摘されます。
識別子"i"が定義されていません等と出ています。
  int a ,i ;
を変数の宣言というと前に説明していますが、
これは、こう説明してもよいのです。
整数を入れる箱を2つ用意して、
それぞれの箱の名前をaとiと定義する

です。
定義は小学生の皆さんにとってなじみのない言葉ですが、
約束するという意味です。
言葉の意味を定めるとか約束することを定義というのです。

でも変ですよね。
  int a = 0,i = 1;
で2つの箱を用意してそれぞれの名前をaとiと定義してから、
aには0を、iには1を入れたはずです。
それなのになぜ定義されていないと出てきてしまうのでしょうか。
理由は、基本的に箱(変数)はその箱を定義した社員専用のもので、
他の社員は一切使えないのです。
007
mainが定義した(用意した)箱は、mainの中でしか使えないのです。
箱(変数)の使える範囲をスコープといいます。
この言葉を使えば、aとiのスコープは図の
に限定されているのです。
それならば、
#include<stdio.h>
void f();
int main()
{
  f();
  printf("1+2+3+4+5+6+7+8+9+10 = %d\n", a);
  return 0;
}
void f() {
  int a = 0, i = 1;
  while (i>0) {
    a = a + i;
    i++;
    if (i > 10)break;
  }
}
コピペ用添付ファイル
と変更したらどうでしょうか。
それでも、
006
と2つのエラーが出てしまいます。
そうなのです。
社員f()が定義(用意)した箱は、社長であっても使えないのです。
使えるのは社員f()だけなのです。
スコープが関数の範囲内に限定されている変数を
ローカル変数といいます。
そして、C言語の変数はローカル変数が基本なのです。
これはとても不便なように思えるかもしれませんが、
C言語が王道を歩んできた、最大の長所の1つなのです。
今では、すべてのプログラム言語がC言語のようにローカル変数となっていますが、
他の言語がC言語のまねをしただけなのです。
なぜ、他の言語もC言語のやり方にならったのか。
ゲームプログラミングにしてもOSのプログラムにしてもとても大きなプログラムです。
何十人から何千人のプログラマーが、
開発に携わっています。
それぞれが部品(関数)を開発するわけですが、
もし、他の関数で箱の中身が取り替えられてしまったら、
困りますね。
開発者は、
すべての部品の中身がどうなっているか知らないといけないことになってしまいます。
でも、変数の中身が他の関数では変えられないようになっていれば、
開発者は他の部品の中身を知らなくてよいのです。
わざわざ
独立部品という言い方をしているのは、
他の部品から完全に独立している=
他から干渉(かんしょう−相手の行動を自分の考えでコントロールしようとすること)
されないことを示すためです。
(尚、関数のことを部品とか社員といっていますが、
その言い方は一般的な呼び方ではありません。
独立部品もそうです。)


でも、プログラム全体で使える箱(変数)もほしいですよね。
もちろん、C言語ではプログラム全体で使える箱も用意しています。
それをグローバル変数というのです。
では、グローバル変数とはどうやったら作れるのでしょうか。
簡単です。
mainの前の行で変数の宣言をすればよいのです。
ですから、先ほどの問題は
#include<stdio.h>
void f();
int a = 0, i = 1;
int main()
{
  f();
  printf("1+2+3+4+5+6+7+8+9+10 = %d\n", a);
  return 0;
}
void f() {
  while (i>0) {
    a = a + i;
    i++;
    if (i > 10)break;
  }
}
コピペ用添付ファイル

では皆さんゲームプログラミングに戻りましょう。
グローバル変数の宣言は
  int mx,my; //bar(バー)やblock(ブロック)と区別するためにball(ボール)はmaru(まる)とする
としましょう。
xとyは縦位置と横位置という意味を持たせています
(もたせているのは私がですよ。プログラマーが自由に定義(約束)してよいのです。
箱の名前(変数名)は自由に付けられます!)が、
ただxとyでは、ボールの位置か、バーの位置か、ブロックの位置か区別がつきません。
そこで、バーの位置を(bx,by)で表し、
ブロックの位置を(sx,sy)で表すことにします。
ブロックをbar(バー)と区別するためにsikakuとするからです。
sxはsikakuのxという意味です。
また、
int kiiro = GetColor(255, 255, 0); //黄色に出席番号を割り振りその番号を箱kiiroに収納
もグローバル変数にしてください。




第7話へ  第9話へ
a

初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門

数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ