第1章05 エラーが出た時の対応@イチからゲーム作りで覚えるC言語

エラーメッセージたち

イチからゲーム作りで覚えるC言語
連載ページ一覧へ
1章06 新しいプロジェクトを追加する
NEXT : 1章06 新しいプロジェクトを追加する
1章04 printf関数で迷路モドキの表示 : PREV

この記事でやること

前回はMicrosoft社の “Visual Studio” で初めてC言語でソースコードを書いて、迷路を表示するプログラムを動かして、一行一行のイミを確認するところまでいきました。
今回はタイプミスしていたり、ビルドが失敗したときの今時点での確認ポイントをまとめてみようと思います。
とりあえずこの記事は飛ばして、エラーがでたらこのページに戻ってきて解決方法を探るヒントにする、という使い方でも良いかと思います。
なおソースコードや関連する画像や音楽などのファイルなど、プログラムが大きくなればなるほど新しいエラーが出てきて原因の特定が難しくなったりしますが、ここでは本当に最初に知っておいたほうがよい基本的なエラーへの対応方法だけを書いておきます。

この記事はゆる~くC言語でゲームを作りながらプログラミングを学ぶための連載記事です。シリーズものですので記事の一覧はこちらを参照してくださいね。

ソースコードの中身(おさらい)

前回の迷路を表示するプログラムを作るために、こんなソースコードを書きました。

#include <stdio.h>
void main()
{
  printf("あなたは身に覚えのない借金を背負い\n");
  printf("洞窟で財宝を探しています。\n");
  printf("財宝までつながってるのは1~3番のうち何番でしょう?\n");
  printf("*--+--+-----+---+----+---*\n");
  printf("|1 | 2|     |   |    |   |\n");
  printf("|  |     |    |   |  | | |\n");
  printf("|  +-----+----+ +-+  | | |\n");
  printf("|             |   +-++ | |\n");
  printf("+----+ -----+ | |   |  | |\n");
  printf("|  3 |      +-+-+ --+ ++ |\n");
  printf("|    | |  | |   |     |  |\n");
  printf("|   ++-++-+ | | +-----+ -+\n");
  printf("| --+   | | +-+ |        |\n");
  printf("|     |   |   |     財宝 |\n");
  printf("+-----+---+---+-+--------+\n");
}

単純なコードですが、コピー&ペーストではなく、キーボードでタイピングしたりするときに、よく出るエラーパターンを書いていこうと思います。

ビルドエラーの確認とソースコードの修正対応をやってみよう

Visual Studio ではビルドが失敗したとき、エラーが画面に表示されます。いろいろなエラーコードのパターンがあり、実際に経験値をつまないとどこでエラーが発生しているかを調べ上げるのに時間がかかったり、挫折することもよくある話かと思います。

今後プログラミングをするにあたって、実際にエラーが出た時に振り返れるように、何点かわざとエラーを出して、よくあるケースを探ってみます。

main関数がないときのエラー

では、実際に上のプログラムで2行目の「void main()」が「void maaan()」と打ち間違えちゃた時のビルドの流れを確認してみます。

まず、Ctrl + F5でプロジェクトを実行し、ビルドをすると、以下のウィンドウがでてきました。

ビルド失敗時の確認ダイアログ

ビルド失敗時の確認ダイアログ

ビルドエラーが発生したと書いてありますね。もし一度でもプロジェクトでビルドがうまくいっていたら、「続行して、成功したビルドを実行しますか?」というメッセージが表示されます。
ここではい(Y)を選ぶと、前回うまくいったときのプログラムが内部で残っているので、それが実行されます。
今回はエラーへの対応をお話したいので、いいえ(N)を選択します。

エラー一覧ウィンドウ

エラー一覧ウィンドウ

すると、上のようなVisual Studio の画面内で自動的にエラー一覧ウィンドウが開かれると思います。もし自動的に開かない場合は、エラー一覧のタブを探してクリックすれば手動で表示することができます。

main関数がないときのエラーの説明

ウィンドウの中身にいろいろ情報がでていますね。
ウィンドウの上部にはなにやら2エラー」と表示があり、ビルド時に2件のエラーが出ているということがわかります。基本的にエラーはプログラムが実行できなくなるような致命的なミスが見つかったことを表しています。
その2件のエラーの内容はウィンドウ内にそれぞれ一覧で説明が表示されているかと思います。

エラーの内容
重要度コード説明プロジェクトファイル
LINK2019未解決の外部シンボル _main が関数 “int __cdecl invoke_main(void)” (?invoke_main@@YAHXZ) で参照されました。0010_moji
_hyouji
MSVCRTD.lib
(exe_main.obj)
1
LINK11201 件の未解決の外部参照0010_moji
_hyouji
0010_moji
_hyouji.exe
1

今回は自分でわざと main関数をmaaan関数に書き換えたため、エラーの原因がわかっています。
前の記事でもお話しましたが、コンソールプログラムを動かすためには、プロジェクトの中に、main関数がないと、プログラムが開始する場所がわからずにエラーとなります。

解決方法としては、main 関数をきちんと定義してあげること。
タイプミスや、プロジェクト内にちゃんとmain関数を持つソースコードが存在することをチェックしてみて下さい。
修正後、もう一度ビルドしてエラーが0件になっていれば解消です。

エラー説明をみてもなんのこっちゃ?という、あまり説明になっていないこともよくあります。ここでは「invoke_main(void)」という、ビルド時に自動的に組み込まれるプログラムの最初の処理の中で、プログラムの始まる関数であるmain関数を呼び出し(参照)しようとしたら未解決(見つからなかった)という意味、となんとなく理解しておけば良いかと思います。

printf をタイプミスした時のエラー

printf を print と打ち間違え(最後の「f」が不足)してたらどのようなエラーとなるでしょうか。実際にやってみると、以下のようなエラーがでます。

printf 関数のタイプミスのときのエラー

printf 関数のタイプミスのときのエラー

エラーが 2 件、警告が 1 件と表示されていますね。
警告の意味ですが、一般的に「ビルドはできるけどひょっとして・・うまくプログラムができてないかもよ。」ということを表します
警告だけでしたらプログラムが出来上がり、実行することができますが、エラーも同時に発生しているので、結局ビルドは失敗しており、動かせるプログラムにはなりませんでした。

printf関数を打ち間違えた時のエラーの説明

エラーの内容
重要度コード説明プロジェクトファイル
C4013関数’print’は定義されていません。int型の値を返す外部関数と見なします。0010_moji
_hyouji
source.c4
LINK2019未解決の外部シンボル _print が関数 _main で参照されました。0010_moji
_hyouji
Source.obj1
LINK11201 件の未解決の外部参照0010_moji
_hyouji
0010_moji
_hyouji.exe
1

エラーを見てみると、2行目と3行目は前回と同じコードです。同じコードということは、同じような原因ということになります。さきほどはmain関数がみつからなかった、今回はprint関数が見つからなかった、ということですので、呼び出ししようとした関数が見つからなかった(未解決の関数が参照された)というときの、よくあるエラーコードであることがわかります。

1行目の警告をみてみると、まさに「関数 ‘ print ‘ が定義されていません。」と書いてありますね。また、「ファイル」と「行」の列をみると、「source.c」の「4」行目が原因で警告だしてる、とまでわかります。
「int型の値を返す外部関数と見なします。」については、とりあえず、どっか他にありそうな場所を探してみることにして、このままビルドをすすめるよ、というふうに何となく理解してもらえればと思います。(外部関数とかはまた別の時に書こうかと思います。)

解決方法

警告のメッセージに書いてある通り、4行目の print 関数が打ち間違え(存在しない関数を呼び出そうとしている)なので、こちらを printf 関数に修正します。
再度ビルドをして、ちゃんと エラーが 0 件となることを確認しましょう。

警告がでてもプログラムに問題がでるとは限りません。実際にはなにも問題なくプログラムが出来上がる(ビルドできる)ことも多くあります。
それと、どういった内容なら警告やエラーにするかは設定で変えることもできます。ただ、なるべく警告は出さないようにプログラミングしていくのが綺麗なソースコードを作ることにもつながると思います。

セミコロンを関数呼び出しの末尾に付け忘れた時のエラー

printf 関数などを呼び出すとき、命令の最後に記号「;」(セミコロン)を付ける必要があります。このセミコロンで一つの命令が終わっていて、ここから先は別の命令が始まる、という風にビルド(コンパイラがコンパイル)するときにチェックされています。
ここを付け忘れるなんてことはおっちょこちょいな自分には非常によくあることですが、そうしたとき、どのようなエラーが出るでしょうか。確認してみます。

#include <stdio.h>
void main()
{
	printf("1行目\n");
	printf("2行目\n")
	printf("3行目\n");
}

こんなコードを用意しました。気づいたでしょうか。
5行目の末尾に「;」がなければいけないのに、書きもらしてしまっています!

関数呼び出しの後に「;」を付け忘れた時のエラーの説明

このような場合でビルドすると、下のようなエラーがでます。

セミコロン書き漏れ時のエラー

セミコロン書き漏れ時のエラー

エラーの内容
重要度コード説明プロジェクトファイル
E0065‘;’ が必要です0010_moji
_hyouji
Source.c6
C2146構文エラー: ‘;’ が、識別子 ‘printf’ の前に必要です。0010_moji
_hyouji
source.c6

1行目にこんなアイコンがでてますね。これはソースコードに書いた命令の文法が間違っているときに出るエラーです。説明をみるとわかる通り、「’;’が必要です」とかいてあり、セミコロン打ち間違えたんだなー、とうのがわかります。打ち間違えた場所は「ファイル」と「行」の列を見てみましょう。Source.cファイルの6行目とわかります。
2行目にも同じ内容でエラーが出ていますね。関数名についても補足してくれています。6行目のprintf 関数の前にセミコロン足りてないじゃん!と伝えてくれます。

実際に「;」が書き漏れているのは 5 行目なのですが、ビルド(の中でコンパイル)する時に、
コンパイル処理:「5行目末尾にセミコロンがないな・・。命令の文法が6行目まで続いているかも?じゃあ6行目まで見に行こう。ん、6行目まで見に行ったら、次の関数呼び出しがはじまちゃったよ!こりゃエラーだ!」
ということで、6行目で判明したエラーということで行に「6」と出ている、ということかと思われます。

解決方法

説明に書いてある通り、6行目の printf 関数の前に「;」(セミコロン)が足りていないので、ちゃんと書いてあげます。

Visual Studio 上での文法チェック

さきほどの「;」セミコロン付け忘れは、実際にビルドしなくともVisual Studio のソースコード上で間違いがわかるようにチェックしてくれたりします。実際に「;」セミコロンを付け忘れた上のコードは、Visual Studio 上ではこんな風に表示されます。

ドキュメントウィンドウ上のエディタにエラー表示

ドキュメントウィンドウ上のエディタにエラー表示

6行目の printf 関数に赤い波線が下にひいてあります。これは文法チェックを自動的にやってくれて、文法ミスがある場所をリアルタイムに判別してくれています。
それと、開いている文章(この場合はSource.c)のどのあたりにエラーとなる文法があるのか、エディタの右側のスクロールバー上に赤い点で教えてくれます
実際にプログラミングする時にもよくお世話になる機能なので、積極的に活用しましょう。

なお、エラー一覧をダブルクリックすると、「ファイル」の「行」に自動的にジャンプしてくれる機能があります。単純なソースコードの書き間違えが原因でしたら、ジャンプ先の周辺にコードの打ち間違えなどがないか探してみると簡単にエラーの原因がわかることが多いです。

いろいろなエラー

ここまで3つの例をもとにエラーの解説、原因、対処方法を書いてきました。
ただ、エラーコードやエラーの原因は無限に存在しますので、その場その場で一つ一つ原因と対応方法を確認していくことが必要です。

Googleで検索

Googleなどで検索するヒントとして、コードがエラーメッセージにでているので、事象と合わせて検索すると有用な情報がみつかるかもしれません。
検索キーワード例:「C2146 セミコロン」など。

MSDNで調べる

MSDNという、Microsoft社が公開している仕様書を確認するのも重要です。
英語を読む必要がある場合もあるので、その場合プログラミングの用語は多少抑えておく必要があります。日本語への機械翻訳でもなんとなく概要やキーワードはつかめると思いますので、役に立つと思います。(ページの最後のほうに、Microsoft社(公式)の日本語機械翻訳されたページへのリンクをはっておきました。)

あとがき

エラーメッセージに対するよくある原因と対応方法は別のどこかでまとめようかとか思ってます。今日はここまで。お疲れさまでした。

イチからゲーム作りで覚えるC言語
連載ページ一覧へ
1章06 新しいプロジェクトを追加する
NEXT : 1章06 新しいプロジェクトを追加する
1章04 printf関数で迷路モドキの表示 : PREV

非常に参考になったサイトさまや、参考文献など

ページの更新履歴

更新日更新内容
更新なし