表示調整
閉じる
挿絵表示切替ボタン
▼配色
▼行間
▼文字サイズ
▼メニューバー
×閉じる

ブックマークに追加しました

設定
0/400
設定を保存しました
エラーが発生しました
※文字以内
ブックマークを解除しました。

エラーが発生しました。

エラーの原因がわからない場合はヘルプセンターをご確認ください。

ブックマーク機能を使うにはログインしてください。
31/37

第二十九話 プロトタイプ宣言


「うむむむ……」

 俺は詰まっていた。

 画面を凝視する。

 コマンドプロンプト上では、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の解説を少しするわ。前に言ってたよね、構造体のこと。これをちょっと教えるわね」


 先輩はそう言うと、メモ帳を消して、新たにプログラムを作り始める。

評価をするにはログインしてください。
この作品をシェア
Twitter LINEで送る
ブックマークに追加
ブックマーク機能を使うにはログインしてください。
― 新着の感想 ―
このエピソードに感想はまだ書かれていません。
感想一覧
+注意+

特に記載なき場合、掲載されている作品はすべてフィクションであり実在の人物・団体等とは一切関係ありません。
特に記載なき場合、掲載されている作品の著作権は作者にあります(一部作品除く)。
作者以外の方による作品の引用を超える無断転載は禁止しており、行った場合、著作権法の違反となります。

この作品はリンクフリーです。ご自由にリンク(紹介)してください。
この作品はスマートフォン対応です。スマートフォンかパソコンかを自動で判別し、適切なページを表示します。

↑ページトップへ