いきなりですが問題です.次のプログラムをコンパイルしたら,どうなるでしょうか.
/* midpoint.c */ #include <stdio.h> struct point { double x, y; }; int main(void) { struct piont p, q, r; p.x = 1.2; p.y = 3.4; q.x = 3.1; q.y = 2.7; r.x = (p.x + q.x) / 2; r.y = (p.y + q.y) / 2; printf("P(%g,%g) - R(%g,%g) - Q(%g,%g)\n", p.x, p.y, r.x, r.y, q.x, q.y); return 0; }
中点を求めるプログラムです.点を,自作のpoint構造体で表しています.
さっそくですがコンパイル結果です.Ubuntuだと:
$ gcc -Wall -o midpoint midpoint.c 2midpoint.c: 関数 ‘main’ 内: midpoint.c:11:16: エラー: ‘p’ の記憶域サイズが不明です midpoint.c:11:19: エラー: ‘q’ の記憶域サイズが不明です midpoint.c:11:22: エラー: ‘r’ の記憶域サイズが不明です midpoint.c:11:22: 警告: 使用されない変数 ‘r’ です [-Wunused-variable] midpoint.c:11:19: 警告: 使用されない変数 ‘q’ です [-Wunused-variable] midpoint.c:11:16: 警告: 使用されない変数 ‘p’ です [-Wunused-variable]
Cygwinだと:
$ gcc -Wall -o midpoint midpoint.c midpoint.c: In function ‘main’: midpoint.c:11:16: error: storage size of ‘p’ isn’t known midpoint.c:11:19: error: storage size of ‘q’ isn’t known midpoint.c:11:22: error: storage size of ‘r’ isn’t known midpoint.c:11:22: 警告: unused variable ‘r’ midpoint.c:11:19: 警告: unused variable ‘q’ midpoint.c:11:16: 警告: unused variable ‘p’
日本語の環境変数を取り除くと:
$ LC_ALL=C gcc -Wall -o midpoint midpoint.c midpoint.c: In function 'main': midpoint.c:11:16: error: storage size of 'p' isn't known midpoint.c:11:19: error: storage size of 'q' isn't known midpoint.c:11:22: error: storage size of 'r' isn't known midpoint.c:11:22: warning: unused variable 'r' midpoint.c:11:19: warning: unused variable 'q' midpoint.c:11:16: warning: unused variable 'p'
エラーは11行目というので,この行だけを取り出すと:
struct piont p, q, r;
「piont」は,スペルミスです.これを「point」に修正すれば,コンパイル・実行とも,うまくいきます.
前回の演習授業中に,学生からうまく動かないと相談がありました.コンパイルエラーが多数だったのですが,その一つが,「storage size of 変数名 isn’t known」でした*1.他の学生では見かけないエラーだった*2ので,他のところを修正してくださいと言ったものの,授業終了の時間になってもエラーが解消できず,ソースファイルをメールを送ってもらって,手元でコンパイルしてやっと,構造体タグの書き間違いに気づいたのでした.エラーメッセージに,上の例だとpointもpiontも出現しないのが,曲者です.
「記憶域サイズが不明です」「storage size of 変数名 isn't known」が出たときは,変数名そのものではなく,変数の型名が適切か,特に構造体だったら,その宣言と対応しているかを,チェックせよということなのですね….
2008年に書いたこと:
(最終更新:2013-10-19 朝)
*1:Vine Linuxを用いています.
*2:巡回中に多く見かけたトラブルは,戻り値を必要とする関数の定義でreturn文を書いていないのが原因でした.