コンパイルエラーを直す その 1
前回のエントリーで書いた通り、データ分離版ローグ・クローンIIはコンパイルエラーで、そのままではコンパイルできません。
このコンパイルエラーを直して、ゲームを遊べようにした作業を 今日を含め 2回に分けて書きます。
さっそく、エラーの内容を見ていきましょう。
以下は gcc から出力されたコンパイルエラー部分です。
machdep.c: 関数 `md_slurp' 内: machdep.c:281: error: structure has no member named `_cnt' machdep.c: トップレベル: machdep.c:326: 警告: return type defaults to `int' machdep.c: 関数 `md_control_keyboard' 内: machdep.c:367: error: `VSWTCH' undeclared (first use in this function) machdep.c:367: error: (Each undeclared identifier is reported only once machdep.c:367: error: for each function it appears in.) machdep.c:367: error: `CNSWTCH' undeclared (first use in this function) machdep.c: トップレベル:
2行目に machdep.c:281: error: 〜 と表示されているのが gcc のエラー表示です。
先頭部分は、ファイル名と行を表しています。
この行をざっくり訳すると、『machdep.c という名前のファイルの 281 行目にエラーだよ。「_cnt」なんて構造体のメンバーないよ。」』ぐらいになるでしょう。
これでソースのどこを見ればいいか分かりました。
machdep.c の 281 行目より前の処理を見ましょう。
以下はソースコードの引用ですが、先頭についている数字は行数を表します。
278:#ifdef UNIX_386BSD 279: fpurge(stdin); 280:#else 281: ln += stdin->_cnt; 282: for (; ln > 0; ln--) { 283: (void) getchar(); 284: } 285:#endif
ここは関数の最初から読まないと分かりにくいのですが、 279 行目と 281〜284行目は同じ処理を行っています。
おそらく fpurge 関数が機種依存で移植先の環境になかったのでしょう。同じ内容を実現させようと fpurge 関数を使わずに書いたようです。
つまり、 fpurge 関数があれば、エラーはなくなります。
ここで、 Linux に fpurge 関数があるか調べてみましょう。
検索エンジンで 「fpurge」を調べると、 http://www.linux.or.jp/JM/html/LDP_man-pages/man3/fpurge.3.html がヒットしました。
そのサイトの内容を読むと、 Linux では fpurge 関数はサポートされていないと書いていました。
しかし、よく読み直してみると、説明の所に fflush も参照のことと記されています。
もしかしたら似た処理の関数かもしれませんので、指示に従って fflush ののページを見ましょう。
いいことが書いていました。
fflush は fpurge と似た関数で、しかも Linux でサポートされていると書いています。
ちょうど良い関数を見付けたので、ソースの修正に移ります。
このソースに対してのエラーの修正は
278:#ifdef UNIX_386BSD 279: fpurge(stdin); 280:#else 281: fflush(stdin); 282:#endif
と 281 行目を書き換えるだけで終了です。短くなって良いですね。
書き換えたら、コンパイルが通るかチェックです。
machdep.c: 関数 `md_control_keyboard' 内: machdep.c:364: error: `VSWTCH' undeclared (first use in this function) machdep.c:364: error: (Each undeclared identifier is reported only once machdep.c:364: error: for each function it appears in.) machdep.c:364: error: `CNSWTCH' undeclared (first use in this function)
先ほどのエラーは消えました。
ただ、コンパイルエラーは他のものが残っていてまだコンパイルはできません。
次回はこのコンパイルエラーの修正を書きます。