Nodachisoft Nodachi Sword Icon
  
@あまじ✎ 2018年6月12日に更新

第1章05 エラーが出た時の対応

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

この記事でやること

前回はMicrosoft社の "Visual Studio" で初めてC言語でソースコードを書いて、迷路を表示するプログラムを動かして、一行一行の意味を確認するところまでいきました。 今回はタイプミスしていたり、ビルドが失敗したとき、どうするかの手動での確認ポイントをまとめてみようと思います。(デバッガなどのツールを使わない、最初のポイントです)

とりあえずこの記事は飛ばして、 エラーがでたらこのページに戻ってきて解決方法を探るヒントにする、という使い方でも良いかと思います。

なおソースコードや関連する画像や音楽などのファイルなど、プログラムが大きくなればなるほど新しいエラーが出てきて原因の特定が難しくなったりしますが、ここでは本当に最初に知っておいたほうがよい基本的なエラーへの対応方法だけを書いておきます。

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

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

 
Source.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関数がないときのエラーの説明

ウィンドウの中身にいろいろ情報がでていますね。

ウィンドウの上部にはなにやら 0105 langc 0030 vs error icon のマークで「2エラー」と表示があり、ビルド時に2件のエラーが出ているということがわかります。 基本的にエラーはプログラムが実行できなくなるような致命的なミス が見つかったことを表しています。

その2件のエラーの内容はウィンドウ内にそれぞれ一覧で説明が表示されているかと思います。

エラーの内容

重要度 コード 説明 プロジェクト ファイル
0105 langc 0030 vs error icon LINK2019 未解決の外部シンボル _main が関数 "int _cdecl invokemain(void)" (?invoke_main@@YAHXZ) で参照されました。 0010_moji _hyouji MSVCRTD.lib (exe_main.obj) 1
0105 langc 0030 vs error icon LINK1120 1 件の未解決の外部参照 0010_moji _hyouji 0010_moji _hyouji.exe 1

今回は自分でわざと main関数をmaaan関数に書き換えたため、エラーの原因がわかっています。

前の記事でもお話しましたが、コンソールプログラムを動かすためには、プロジェクトの中に、main関数がないと、プログラムが開始する場所がわからずにエラーとなります。

ですので解決方法としては、main 関数をきちんと定義してあげること。

タイプミスや、プロジェクト内にちゃんとmain関数を持つソースコードが存在することをチェックしてみて下さい。

修正後、もう一度ビルドしてエラーが0件になっていれば解消です!

ワンポイント

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

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

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

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

0105 langc 0030 vs error icon

エラーが 2 件

0105 langc 0050 vs warn icon

警告が 1 件

と表示されていますね。

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

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

エラーの内容

重要度 エラーコード
0105 langc 0050 vs warn icon C4013
0105 langc 0030 vs error icon LINK2019
0105 langc 0030 vs error icon LINK1120

0105 langc 0030 vs error icon

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

0105 langc 0050 vs warn icon

1行目の警告をみてみると、まさに「関数 ' print ' が定義されていません。」と書いてありますね。また、「ファイル」と「行」の列をみると、「source.c」の「4」行目が原因で警告だしてる、とまでわかります。

「int型の値を返す外部関数と見なします。」については、"とりあえず、どっか他にありそうな場所を探してみることにして、このままビルドをすすめるよ、と解釈された" というふうに何となく理解してもらえればと思います。(外部関数とかはまた別の時に書こうかと思います。)

解決方法

警告のメッセージに書いてある通り、4行目の print 関数が打ち間違え(存在しない関数を呼び出そうとしている)なので、こちらを printf 関数に修正します。

再度ビルドをして、ちゃんと エラーが 0 件となることを確認しましょう。

ワンポイント

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

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

printf 関数などを呼び出すとき、命令の最後に記号「;」(セミコロン)を付ける必要があります。このセミコロンで一つの命令が終わっていて、ここから先は別の命令が始まる、という風にビルド(コンパイラがコンパイル)するときにチェックされています。

ここを付け忘れるなんてことはおっちょこちょいな私には非常によくあることですが、そうしたとき、どのようなエラーが出るでしょうか。確認してみます。

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

こんなコードを用意しました。気づいたでしょうか。

5行目の末尾に「;」がなければいけないのに、書きもらしてしまっています!あぁ、シマッタナー!

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

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

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

エラーの内容

重要度 エラーコード
0105 langc 0050 vs erroractive icon E0065
0105 langc 0030 vs error icon C2146

1行目にこんなアイコンがでてますね。

0105 langc 0050 vs erroractive icon

これは ソースコードに書いた命令の文法が間違っているときに出るエラーです。説明をみるとわかる通り、「';'が必要です」とかいてあり、セミコロン打ち間違えたんだなー、とうのがわかります。打ち間違えた場所は「ファイル」と「行」の列を見てみましょう。Source.cファイルの6行目とわかります。

2行目にも同じ内容でエラーが出ていますね。 0105 langc 0030 vs error icon

関数名についても補足してくれています。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章04 printf で迷路モドキの表示 : PREV
NEXT : 第1章06 新しいプロジェクトを追加する :
 
 
送信しました!

コメント、ありがとうございます。

なんかエラーでした

ごめんなさい。エラーでうまく送信できませんでした。ご迷惑をおかけします。しばらくおいてから再度送信を試していただくか、以下から DM などでご連絡頂ければと思います。

Twitter:@NodachiSoft_jp
お名前:
 
連絡先:
 
メッセージ:
 
戻る
内容の確認!

以下の内容でコメントを送信します。よろしければ、「送信」を押してください。修正する場合は「戻る」を押してください

お名前:
 
連絡先:
 
メッセージ:
 
Roboto からの操作ではないという確認のため確認キーを入れてください。
確認キー=95
戻る
 / 
送信確認へ
コメント欄
コメント送信確認へ

関連ありそうな記事(5件)です!

ゲーム等で使えるつなぎ目のないループするテクスチャ画像の作り方

#ツール#ゲームプログラミング✎ 2021-01-24
ゲームなどで使えるループ画像、パターンテクスチャのツール、手動での作り方をまとめ
広告領域
追従 広告領域
目次
第1章05 エラーが出た時の対応
第1章05 エラーが出た時の対応
この記事でやること
この記事でやること
ソースコードの中身(おさらい)
ソースコードの中身(おさらい)
ビルドエラーの確認とソースコードの修正対応をやってみよう
ビルドエラーの確認とソースコードの修正対応をやってみよう
main関数がないときのエラー
main関数がないときのエラー
main関数がないときのエラーの説明
main関数がないときのエラーの説明
printf をタイプミスした時のエラー
printf をタイプミスした時のエラー
printf関数を打ち間違えた時のエラーの説明
printf関数を打ち間違えた時のエラーの説明
解決方法
解決方法
セミコロンを関数呼び出しの末尾に付け忘れた時のエラー
セミコロンを関数呼び出しの末尾に付け忘れた時のエラー
関数呼び出しの後に「;」を付け忘れた時のエラーの説明
関数呼び出しの後に「;」を付け忘れた時のエラーの説明
解決方法
解決方法
Visual Studio 上での文法チェック
Visual Studio 上での文法チェック
いろいろなエラー
いろいろなエラー
Googleで検索
Googleで検索
MSDNで調べる
MSDNで調べる
あとがき
あとがき
非常に参考になったサイトさまや、参考文献など
非常に参考になったサイトさまや、参考文献など
ページの更新履歴
ページの更新履歴
Nodachisoft © 2020