前回はMicrosoft社の "Visual Studio" で初めて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 ではビルドが失敗したとき、エラーが画面に表示されます。いろいろなエラーコードのパターンがあり、実際に経験値をつまないとどこでエラーが発生しているかを調べ上げるのに時間がかかったり、挫折することもよくある話かと思います。
今後プログラミングをするにあたって、実際にエラーが出た時に振り返れるように、何点かわざとエラーを出して、よくあるケースを探ってみます。
では、実際に上のプログラムで2行目の「void main()」が「void maaan()」と打ち間違えちゃた時のビルドの流れを確認してみます。
まず、
+ でプロジェクトを実行し、ビルドをすると、以下のウィンドウがでてきました。
ビルドエラーが発生したと書いてありますね。もし一度でもプロジェクトでビルドがうまくいっていたら、「続行して、成功したビルドを実行しますか?」というメッセージが表示されます。
ここで
を選ぶと、前回うまくいったときのプログラムが内部で残っているので、それが実行されます。今回はエラーへの対応をお話したいので、
を選択します。すると、上のようなVisual Studio の画面内で自動的にエラー一覧ウィンドウが開かれると思います。もし自動的に開かない場合は、 のタブを探してクリックすれば手動で表示することができます。
ウィンドウの中身にいろいろ情報がでていますね。
ウィンドウの上部にはなにやら
のマークで「2エラー」と表示があり、ビルド時に2件のエラーが出ているということがわかります。
基本的にエラーはプログラムが実行できなくなるような致命的なミス
が見つかったことを表しています。
その2件のエラーの内容はウィンドウ内にそれぞれ一覧で説明が表示されているかと思います。
エラーの内容
今回は自分でわざと main関数をmaaan関数に書き換えたため、エラーの原因がわかっています。
前の記事でもお話しましたが、コンソールプログラムを動かすためには、プロジェクトの中に、main関数がないと、プログラムが開始する場所がわからずにエラーとなります。
ですので解決方法としては、main 関数をきちんと定義してあげること。
タイプミスや、プロジェクト内にちゃんとmain関数を持つソースコードが存在することをチェックしてみて下さい。
修正後、もう一度ビルドしてエラーが0件になっていれば解消です!
エラー説明をみてもなんのこっちゃ?という、あまり説明になっていないこともよくあります。ここでは「invoke_main(void)」という、ビルド時に自動的に組み込まれるプログラムの最初の処理の中で、プログラムの始まる関数であるmain関数を呼び出し(参照)しようとしたら未解決(見つからなかった)という意味、となんとなく理解しておけば良いかと思います。
printf を print と打ち間違え(最後の「f」が不足)してたらどのようなエラーとなるでしょうか。実際にやってみると、以下のようなエラーがでます。
エラーが 2 件
警告が 1 件
と表示されていますね。
警告の意味ですが、一般的に「ビルドはできるけどひょっとして・・うまくプログラムができてないかもよ。」ということを表します。 警告だけでしたらプログラムが出来上がり、実行することができますが、エラーも同時に発生しているので、結局ビルドは失敗しており、動かせるプログラムにはなりませんでした。
エラーの内容
重要度 | エラーコード |
---|---|
![]() |
C4013 |
![]() |
LINK2019 |
![]() |
LINK1120 |
エラーを見てみると、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 |
![]() |
C2146 |
1行目にこんなアイコンがでてますね。
これは ソースコードに書いた命令の文法が間違っているときに出るエラーです。説明をみるとわかる通り、「';'が必要です」とかいてあり、セミコロン打ち間違えたんだなー、とうのがわかります。打ち間違えた場所は「ファイル」と「行」の列を見てみましょう。Source.cファイルの6行目とわかります。
関数名についても補足してくれています。6行目のprintf 関数の前にセミコロン足りてないじゃん! と伝えてくれます。 実際に「;」が書き漏れているのは 5 行目なのですが、ビルド(の中でコンパイル)する時に、コンパイル処理:「5行目末尾にセミコロンがないな・・。命令の文法が6行目まで続いているかも?じゃあ6行目まで見に行こう。ん、6行目まで見に行ったら、次の関数呼び出しがはじまちゃったよ!こりゃエラーだ!」
ということで、6行目で判明したエラーということで行に「6」と出ている、ということかと思われます。
説明に書いてある通り、6行目の printf 関数の前に「;」(セミコロン)が足りていないので、ちゃんと書いてあげましょう。 書いた後、ビルドして「成功」を確認したら修正完了です!
さきほどの「;」セミコロン付け忘れは、実際にビルドしなくともVisual Studio のソースコード上で間違いがわかるようにチェックしてくれたりします。実際に「;」セミコロンを付け忘れた上のコードは、Visual Studio 上ではこんな風に表示されます。
6行目の printf 関数に赤い波線が下にひいてあります。これは文法チェックを自動的にやってくれて、文法ミスがある場所をリアルタイムに判別してくれています。
それと、開いている文章(この場合はSource.c)のどのあたりにエラーとなる文法があるのか、エディタの右側のスクロールバー上に赤い点で教えてくれます。
実際にプログラミングする時にもよくお世話になる機能なので、積極的に活用しましょう。
なお、
をダブルクリックすると、エラーを起こした「ファイル」の「行」に自動的にジャンプしてくれる機能があります。単純なソースコードの書き間違えが原因でしたら、ジャンプ先の周辺にコードの打ち間違えなどがないか探してみると簡単にエラーの原因がわかることが多いです。ここまで3つの例をもとにエラーの解説、原因、対処方法を書いてきました。
ただ、エラーコードやエラーの原因は無限に存在しますので、その場その場で一つ一つ原因と対応方法を確認していくことが必要です。
Googleなどで検索するヒントとして、コードがエラーメッセージにでているので、事象と合わせて検索すると有用な情報がみつかるかもしれません。
検索キーワード例:「C2146 セミコロン」など。
MSDNという、Microsoft社が公開している仕様書を確認する のも重要です。
英語を読む必要がある場合もあるので、その場合プログラミングの用語は多少抑えておく必要があります。日本語への機械翻訳でもなんとなく概要やキーワードはつかめると思いますので、役に立つと思います。(ページの最後のほうに、Microsoft社(公式)の日本語機械翻訳されたページへのリンクをはっておきました。)
エラーメッセージに対するよくある原因と対応方法は別のどこかでまとめようかとか思ってます。今日はここまで。お疲れさまでした。
更新日 | 更新内容 |
---|---|
更新なし |
コメント、ありがとうございます。
ごめんなさい。エラーでうまく送信できませんでした。ご迷惑をおかけします。しばらくおいてから再度送信を試していただくか、以下から DM などでご連絡頂ければと思います。
Twitter:@NodachiSoft_jpお名前:以下の内容でコメントを送信します。よろしければ、「送信」を押してください。修正する場合は「戻る」を押してください
お名前: