コンパイルエラーを直す その 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)

先ほどのエラーは消えました。
ただ、コンパイルエラーは他のものが残っていてまだコンパイルはできません。

次回はこのコンパイルエラーの修正を書きます。