第二十九話 プロトタイプ宣言
「うむむむ……」
俺は詰まっていた。
画面を凝視する。
コマンドプロンプト上では、GCC様が怒り狂っていた。
c:¥sample>gcc -o kazuate kazuate.c -Wall
kazuate.c: In function 'main':
kazuate.c:14:3: warning: implicit declaration of function 'loadHiscore'
kazuate.c:48:7: warning: implicit declaration of function 'saveHiscore'
kazuate.c:At top level:
kazuate.c:73:6: warning: conflicting types for 'saveHiscore'
kazuate.c:48:7: note: previous implicit declaration of 'saveHiscore' was here
c:¥sample>_
ハイスコアルーチンのプログラムを作り終えて、意気揚々とコンパイルした途端、これである。
「あらら、警告出まくり」
立花先輩も画面を覗き込んできた。
「先輩、何書いてあるのです?」
「これくらいの英語は読みなさいよ、もう」と言いながらも、先輩は解説してくれた。
「関数loadHiscoreとsaveHiscoreが明示的に宣言されてない、と言うのよ」
「は?」
さっぱりだぜ。
「ま、だいたい想像がつくけど。ちょっとコード見させてくれる?」
先輩は俺の返事を待たずにコードを見ていった。
int main(void)
{
int seikai
int kazu;
int score = 10;
int hiscore = loadHiscore();
char buf[100];
・
・
・
printf("スコアは、 %d です。\n" , score);
if (score > hiscore)
{
printf("ハイスコア更新!\n");
saveHiscore(score);
}
return 0;
}
int loadHiscore(void)
{
ハイスコアをロードする内容いろいろ
}
void saveHiscore(int hiscore)
{
ハイスコアをセーブする内容ずらずら
}
「なるほどねー。あ、わかったわ」
「えっ、もうわかったんですか!?」
「うん。これって、初心者がよくやるミスだもん」
「どこが問題なんでしょう?」西原さんも悩んでいる様子だった。
「これってね、つまりMain関数から、loadHiscoreやsaveHiscoreが『見えない』って問題なのよ。プログラムは上から順にコンパイラに読まれていくでしょ? でも、loadHiscore関数をmainが呼ぼうとしても、その時点ではずっと下にこの関数の定義があるから、コンパイラはまだどこに関数があるのかわからないわけ」
「うむむ。すると、main関数より上に二つの関数を置いたら──」
「それも一つの解決方法ね」先輩は同意した。「だけど、今はまだ簡単なプログラムだからいいけど、これが数百の関数が複雑にからみあったプログラムを想像してみなさい。どれからどれが呼ばれたか、なんていちいち考えてられないわ」
「うむむ。確かに……」
「で、もっと簡単な方法は、プロトタイプ宣言を使うことよ」
「プロトタイプ宣言?」
「最初に関数の名前、引数、戻り値の型のみを書いて、コンパイラに『この先に、こういう関数が実在しますよー』って教えておくの。関数のプロトタイプを宣言。でも、まだ実装はしてない」
「うむむ。そういうのがあるのか」
先輩はカタカタとmain関数の前に数行を追加した。
int loadHiscore(void);
void saveHiscore(int);
int main(void)
「これでオッケーよ」
先輩はgccでコンパイルしてみる。すると確かに、コンパイラは何も言わずに通してくれた。
「どれどれー、ちゃんと動くかな?」
先輩は少しゲームをプレイしてみる。3回目で当てると、「ハイスコア更新」と表示された。
そしてdirコマンドで見てみると、ファイルkazuate.txtが作られている。そこにはハイスコア8が表示されていた。
再びプレイしてみると、4回目で当ててもハイスコアは更新されず、次に2回目で当てたら、ハイスコア更新の表示がされた。
「うん。ちゃんと動いているようね」
「良かったぁー。エラーが出たとき、俺、どうしようかと思いましたよ」
安堵の表情を俺は浮かべた。
困った時には、先輩は頼りになるな。
「これからプログラミングする時は、新しく作った関数は常に、先にプロトタイプ宣言しておくのを勧めるわ。そのうち、それらの宣言をすべて別のファイル──ヘッダファイルって言うんだけど──に書く方法も教えるわね」
「はい、そうします」
「でもイツキくん、ここまで作れると凄いよー」西原さんが褒めてくれる。
「ふう。ありがと。でも、今日は疲れたよ」
「じゃ、ゲームの改造はこれくらいにして、次はCの解説を少しするわ。前に言ってたよね、構造体のこと。これをちょっと教えるわね」
先輩はそう言うと、メモ帳を消して、新たにプログラムを作り始める。