第10講 プログラムソースを複数のファイルに分割して、プログラムをわかりやすくする
第4話 グローバル変数をファイルを超えて有効にするには?

main.cppのコード
#include"main.h"
int a[3][4];
int main()
{
  f(); //データ作成社員
  g(); //データ表示社員
  return 0;
}

f.cppのコード
#include"main.h"
void f() { //データ作成社員
  int i, j;
  for (i = 0; i < 3; i++) {
    for (j = 0; j < 4; j++) {
      a[i][j] = 4 * i + j + 1;
    }
  }
}

g.cppのコード
#include"main.h"
void g() { //データ表示社員
  int i, j;
  for (i = 0; i < 3; i++) {
    for (j = 0; j < 4; j++) {
      if (a[i][j] < 10)printf("0%d ", a[i][j]);
      if (a[i][j] >= 10)printf("%d ", a[i][j]);
    }
    printf("\n");
  }
}

main.hのコード
#include<stdio.h>
#include"f.h"
#include"g.h"

f.hのコード
void f(); //データ作成社員

g.hのコード
void g(); //データ表示社員

Ctrl+F5をすると、

となってエラーしてしまいます。
グローバル変数といえど有効範囲(スコープ)は、
ファイルを超えることはできないのです。

では、解決策はないのでしょうか。
実は、ちょっと改良を加えるだけでできます。
それは、main.hのコードをちょっといじればよいのです。
#include<stdio.h>
#include"f.h"
#include"g.h"
extern int a[3][4];

これで、
#include"main.h"
int a[3][4];
int main()
{
  f(); //データ作成社員
  g(); //データ表示社員
  return 0;
}
で定義されたグローバル配列がファイルの垣根を越えて、
すべてのファイルで使えるようになります。
今は、グローバル配列を例にして説明しましたが、
グローバル変数についても同様です。

例えば、それぞれのコードを
main.cppのコード
#include"main.h"
int a[3][4];
int b=5;
int main()
{
  f(); //データ作成社員
  g(); //データ表示社員
  return 0;
}

f.cppのコード
#include"main.h"
void f() { //データ作成社員
  int i, j;
  
printf("b=%d\n", b);
  for (i = 0; i < 3; i++) {
    for (j = 0; j < 4; j++) {
      a[i][j] = 4 * i + j + 1;
    }
  } 
}

g.cppのコード
#include"main.h"
void g() { //データ表示社員
  int i, j;
  for (i = 0; i < 3; i++) {
    for (j = 0; j < 4; j++) {
      if (a[i][j] < 10)printf("0%d ", a[i][j]);
      if (a[i][j] >= 10)printf("%d ", a[i][j]);
    }
    
printf("b=%d\n", b);
  }
}

main.hのコード
#include<stdio.h>
#include"f.h"
#include"g.h"
extern int a[3][4];
extern int b;

と変更してみますと、

と確かにファイルを乗り越えて、main.cppで定義したグローバル変数bが使えています。

ただし、
int b=5;
extern int b;
の2つを見比べてください。
externのついている文では、変数の型がどうなっているかを教えるだけで、
初期化(変数に最初の値を代入すること)はできないのです。

それでは、第7講第10話で作ったブロック崩し
のプログラムーソースを分割していきたと思いますが、
その前に2つやっておくことがあります。
まず、1つ目がゲームを進める社員の社員名main()がmain.cppと重なっていますので、
この社員の名前をgamemain()に変更することです。
それから、グローバル変数はmain.hで
main.cppで定義したものをコピペしておいて、
externをつけて、初期化してある場合にはそれを外せば、
ファイルを超えて使えるようになるのですが、
私のやった範囲では、
グローバル定数は、うまくいきません。
そこで、ブロック崩しでは、2つグローバル定数
const int s_y = 10, s_t = 4; //ブロック横数と縦数
const int houkougae = -1; //ほうこうがえ 方向チェンジ
を使っていましたが、
それらは、グローバル変数に変更してください。


第3話へ   第5話へ
a

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

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