第11回
エラーメッセージと対処方法(1)〜エラーの原因を突き止める

Cのエラーメッセージを確認する

Cプログラミングで遭遇するエラーを確認するために、わざとソースの記述を間違えてコンパイル・エラーを発生させてみましょう。

九九プログラム

リスト1は、本コラムの第9回で紹介した「九九プログラム」のソースです。ソースの詳しい意味は、既に第9回で説明したので省略します。二重のforループ構造を用いて、外のループで1の段から9の段までを設定し、さらに内側のループで個々の値に対して1〜9を乗算しています。

このソースをコンパイルして実行形式ファイルを作るのですが、WindowsとLinuxなどのUNIX系OSでは、前提としているファイルの保存場所が異なります。

・Windowsの場合
ソース C:\Clang\Source
実行形式ファイル C:\Clang\Exe

・UNIX系OSの場合
ソース ~/source
実行形式ファイル ~/exe

コンパイルのコマンド

上のような環境でソース“kuku.c”をコンパイルして実行形式ファイル(Windowsでは“kuku.exe”、UNIX系OSでは“kuku”)を生成するなら、以下のようなコマンドを入力します。
LSI-C 86の場合
LCC -oC:\Clang\Exe\kuku.exe C:\Clang\Src\kuku.c
GCCの場合
gcc ~/source/kuku.c -o ~/exe/kuku

コンパイルが成功すれば実行形式ファイルが生成され、それを実行するとリスト2のような九九の計算結果が表示されます ※1

画面がスクロールしていくため、すべての計算結果を一望することはできません。第9回で紹介したように、プログラムの出力をテキストファイルにリダイレクトするなどの措置が必要になります
リスト1:九九を計算して表示するプログラム(ex1101.cex1101.exe)
#include <stdio.h>

int	main(void)
{
	int i, j;

	for (i = 1; i <= 9; i++) {
	  printf("◆ %d の段\n", i);
	  for (j=1; j<=9; j++) {
		printf("%d x %d = %d\n", i, j, i * j);
	  }
	  printf("----------------\n", i);
	}
	return (0);
}

リスト2:九九プログラムの実行結果
◆ 1 の段
1 x 1 = 1
1 x 2 = 2
1 x 3 = 3
1 x 4 = 4
1 x 5 = 5
1 x 6 = 6
1 x 7 = 7
1 x 8 = 8
1 x 9 = 9
----------------
◆ 2 の段
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18
----------------
◆ 3 の段
3 x 1 = 3
3 x 2 = 6
3 x 3 = 9
3 x 4 = 12
3 x 5 = 15
3 x 6 = 18
3 x 7 = 21
3 x 8 = 24
3 x 9 = 27
----------------
◆ 4 の段
4 x 1 = 4
4 x 2 = 8
4 x 3 = 12
4 x 4 = 16
4 x 5 = 20
4 x 6 = 24
    :

わざと間違えてみる

この程度の短いソースなら、入力を間違うことはまずあり得ない──と、思う人も多いでしょう。しかし、かの有名な“Hello world!” ※2 でさえ、入力を間違ってしまうことがあります。

どんなに単純なソースでも──あるいは単純であるがゆえに侮ってしまい──間違ってしまうことは十分に考えられます。そして、間違ったソースをコンパイルすると、コンパイラがエラーメッセージを出力してきます。

Cのエラーメッセージは非常にシンプルで、慣れていないと不親切な感じさえします。実際に、間違ったソースで試してみましょう。例えば、リスト3のようにmain関数3行目のprintf関数の呼び出しで、最後のセミコロン(;)を入力し忘れたとしましょう。

このソースをLSI-C 86でコンパイルすると、以下のようなエラーメッセージが出力されます ※3
C:\Clang\Src\ex1103.c 9: syntax error near 'for'
    (a)              (b)          (c)
main関数の中身が“printf("Hello world!\n");”の1行だけというシンプルなソース。Cのバイブルとも呼ばれる「プログラミング言語C」(B.W.カーニハン、D.M.リッチー 著/石田晴久 訳/共立出版 刊)で最初に紹介されるCのソース。本コラムの第2回でもリスト2で同様のソースを紹介しています
LSI-C 86ではコンパイラドライバLCCに-jまたは-j1オプションを付ければ、エラーメッセージを日本語で表示できます。その場合、メッセージは「C:\Clang\Src\ex1103.c 9: for のあたりに構文上の誤りがある」と表示されます
リスト3:文末のセミコロン(;)を忘れたソース(ex1102.c)
#include <stdio.h>

int	main(void)
{
	int i, j;

	for (i = 1; i <= 9; i++) {
	  printf("◆ %d の段\n", i) ---- ★“;”忘れ
	  for (j=1; j<=9; j++) {
		printf("%d x %d = %d\n", i, j, i * j);
	  }
	  printf("----------------\n", i);
	}
	return (0);
}

エラーメッセージとタグジャンプ

エラーメッセージは3つのブロックに分かれ、それぞれ次のような意味を持っています。

(a)エラーが発生したソースのパス
(b)エラーの発生した行
(c)エラーの内容

この形式をTag形式と呼び、一般的なテキストエディタで1行にカーソルを置いてTagジャンプの機能を使えば、(a)で示すファイルを開いて(b)で示す行にカーソルが置かれるようになっています。

コマンドライン形式のコンパイラはエラーメッセージを標準出力(ディスプレイ)に送るため、それを“>”記号でリダイレクトしてテキストファイルに保存すれば、Tagジャンプを使ってエラーのあったファイルを開いて修正できます。