メディア

第16回 プログラム開発中にエラーが出るのはなぜ? どんなエラーがあるの?宮崎 仁のQ&Aでよく分かるマイコン基礎の基礎

» 2015年12月25日 00時00分 公開
[PR/EDN Japan]
PR

コンパイルエラーと実行時エラーがある

Q:Cプログラミングの練習を始めたのですが、自分で書いたプログラムをビルドするとエラーが出てしまい、なかなか先に進めません。やっとエラーがなくなってビルドが成功しても、実行すると何も反応がなかったり、すぐに終了してしまったり、思った通りには動いてくれません。

A:エラーの発生は、プログラム開発で一番嫌なことですね。最初のうちは、どこがエラーなのかも、なぜエラーなのかも分からなくて悩んでしまうことが多いと思います。ここでは、エラーについて少し整理してみましょう。

 まず、エラーは大きく分けるとコンパイルエラーと実行時エラーに分かれます。この2つは、エラーが発生する時期も違いますし、原因や症状も違います(図1)。

photo 図1 プログラム開発のステップとエラーの発生

 開発中に、最初に発生するのがコンパイルエラーです。コンパイルエラーがあると、ビルドの途中で失敗してしまい、実行プログラムが生成されません。文法に違反している部分で発生するエラーなので、文法エラーとも呼びます。タイプミスなどの単純な原因で発生することが多く、プログラミングに慣れてくれば発生も減ってきますし、すぐに修正できるようになります。コンパイルエラーの例については後で紹介しましょう。

 同じようにビルドの途中で発生するエラーとして、リンクエラーもあります。これは、コンパイルに成功した後で、複数のモジュールを結合しようとしたときに発生するエラーです。プログラミング練習の段階では、発生頻度は低いでしょう。

 実行時エラーは、ビルドが成功したプログラムを実行したときに発生します。これには原因も症状もさまざまなレベルのものがあります。プログラムの実行が勝手に終了してしまったり、逆に実行中のプログラムが応答しなくなって終了できないこともあります。同じプログラムでも、入力や計算結果の違いで発生したりしなかったりするので、とても見つけにくいエラーです。

 実行時エラーを発見して修正するためにデバッグ作業を行いますが、デバッグ時には発生しなかったのに、本番の実行時に発生する場合もあります。一番困ってしまうエラーはこれです。

 実行時エラーは文法レベルの間違いではなくて、プログラムの動作自体を正しく理解していないことから生じます。実行時エラーについては、次回に説明しましょう。

コンパイルエラーでは、エラーメッセージに注意する

 コンパイルエラーが発生すると、実行プログラムが生成されないので、プログラムを実行することもできません。その点はとても困ってしまうのですが、実はコンパイルエラーはあまり本質的なエラーではありません。

 記述したソースプログラムは、コンパイラによって機械語に自動翻訳されます。そのときに、文法に違反した部分や、書き忘れた部分、余計なことを書いてしまった部分があると、コンパイラは翻訳できなくなってエラーを出してきます。

photo 図2 TIの統合開発環境「CCS」のビルド画面

 最近の統合開発環境やコンパイラは、とても使いやすくなっています。しかも、例えばテキサス・インスツルメンツ(TI)のMSP430 LaunchPadのような低価格マイコンボードで、CCS(Code Composer Studio)のような高度な統合開発環境を無償で利用できます(図2)。

 その点は入門者にとても優しい時代になったといえます。ただ、エラーの種類によっては、コンパイラのエラーメッセージが分かりにくい場合があります。


Q:例えばどんなエラーがあるのですか。

A:C言語の場合、一番多いミスは文末の「;」の付け忘れかもしれません。C言語では、画面の上で改行していても、「;」を付けない限り1つの行だと解釈されます。例えば、

	a = 0;
	b = a + 1;

と書いたつもりが、

	a = 0
	b = a + 1;

というように1行目に「;」を付け忘れると、コンパイラは、

	a = 0 b = a + 1;

という1つの文だと解釈するため、「b」のところでエラーを出します。


Q:なるほど、これでは翻訳できませんね。

A:この手のエラーは実際の開発ではなかなか理解しにくいものです。というのは、統合開発環境はエラーが発生した行を教えてくれるのですが、画面上の行では次の行にエラーのマークが付きます。

	b = a + 1;

 そして、ここに不適切な文字(この場合は「b」)があります、というようなエラーメッセージが出ます。でも、ここには誤りはないのです。実際の誤りは、前の行の文末の「;」がないことなのです。

	a = 0

 このようなコンパイラの動作を知らないと、コンパイラのエラーメッセージを理解できません。そして、コンパイラは的外れなエラーメッセージばかり出す、と怒ってしまう人も多いのです。


Q:私もそう思っていました。

A:でも、コンパイラとしては、「a = 0」までは正しい文なので、次に「b」が出てきたところでメッセージを出すしかありません。エラーメッセージの前の行にも要注意、と思ってください。

 その他にもいろいろなコンパイルエラーがあります。C言語で多いエラーとしては、かっこの対応が合っていないとか、変数名の宣言を忘れているとか、変数名の大文字と小文字を間違えているなどがあります。

 あと、C言語に限らないのですが、特に発見しにくいエラーとして、文中に全角スペースが入っているというエラーがあります。大抵のプログラミング言語はコメントや文字列データ以外は半角文字だけを使いますが、誤ってかな漢字変換が働いて、文中に全角文字が入ってしまうことがあります。それが、例えば

	a = 255;

と書こうとして、

	a = 255;

になってしまった場合、半角文字と全角文字の違いは見分けやすいですね。それで、文字だけを修正して、

	a = 255;

としても、「a」と「=」の間、「=」と「255」の間に全角スペースが残っていると、やっぱりエラーが出るのです。


Q:スペースの全角と半角の違いは、確かに分かりにくいですね。

A:文字と文字の間だけでなく、行頭のインデント(字下げ)の部分や、タブを使って段をそろえているときに全角スペースがまぎれ込んでいると、まず見分けられません。

 怪しいと思ったら、ソースプログラムの中であらかじめ全角スペースを検索して取り除くのが良いでしょう。


Q:他に、コンパイルエラーで注意することはありますか。

A:コンパイルエラーにはもう1つ注意すべきことがあります。コンパイラは、プログラムの頭から順番に解釈して自動翻訳を進めていくのですが、エラーの種類によっては、途中で解釈ができなくなってコンパイルを中止してしまうことがあります。そうすると、そこから先の部分にあるエラーは、その時点ではエラーメッセージとして出てきません。そして、解釈不能の原因となったエラーを修正すると、その先の部分が解釈されて急にたくさんのエラーが出てくることがあります。

 そのことを知らないと、最初は1個のエラーしかなかったのに修正したら急にエラーが増えたとか、エラーを修正すればするほどエラーが増えると感じてしまうこともあります。でも、それはコンパイラが悪いわけではなくて、もともとの記述にそれだけのエラーがあったわけなので、辛抱強く修正をしてみてください。


【関連リンク】

※MSP430、MSP432はTexas Instruments Incorporatedの商標です。その他すべての商標および登録商標はそれぞれの所有者に帰属します。


Copyright © ITmedia, Inc. All Rights Reserved.


提供:日本テキサス・インスツルメンツ株式会社
アイティメディア営業企画/制作:EDN Japan 編集部/掲載内容有効期限:2016年3月31日

設計に役立つヒント集

宮崎 仁のQ&Aでよく分かるマイコン基礎の基礎:
第24回 割り込みっていろいろあるのですか?どんな種類があるか教えてください。

今回は、外部割り込み、内部割り込み、ソフトウェア割り込みについて詳しく解説しています
全文を読む


電源IC選択のヒント集
電源IC 使用時の注意点をわかりやすく説明しているほか、使用時に発生する可能性のあるさまざまなトラブルとその対処法についても紹介しています。ぜひご利用ください。ダウンロードには myTI アカウントが必要です。
Part 1をダウンロード
Part 2をダウンロード


アナログ回路設計式一覧ポケット・ガイド
日本語版 PDF

英語版で高い評価を受けてきたポケット・ガイドの日本語版が完成しました。基板レベルやシステム・レベルの回路設計でよく使われるアナログ設計式を紹介しています。ダウンロードには myTI アカウントが必要です。
ダウンロード



facebook & twitter

製品情報、セミナーや展示会などのイベント情報をお知らせしています。

RSSフィード

公式SNS

EDN 海外ネットワーク

All material on this site Copyright © ITmedia, Inc. All Rights Reserved.
This site contains articles under license from AspenCore LLC.