わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

記憶域サイズが不明です

いきなりですが問題です.次のプログラムをコンパイルしたら,どうなるでしょうか.

/* 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文を書いていないのが原因でした.