第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話へ
初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための]世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップ