検索
連載

バグ検出ドリル(11)コンパイルエラーは意外に難しい山浦恒央の“くみこみ”な話(111)(3/3 ページ)

バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第11回では、初心者が苦労する「コンパイルエラー」がテーマです。コンパイラが指し示すエラーの箇所から、バグを見つけ出してください!

Share
Tweet
LINE
Hatena
前のページへ |       

5.解答

 下記に解答を示します。

  1. 13行目に全角スペースが入っている
  2. 16行目「i<10」にセミコロンが入っていない
  3. 17行目「inO」がinO(オー)となっている
  4. 17行目「numl」がnuml(エル)となっている
  5. 18行目「prntf」となっている
  6. 19行目「return 0:」がコロンとなっている

 各エラーの詳細は以下で解説します。

5.1 全角スペースと半角スペース

 エラー・メッセージには、以下が書いてあります。

(13): error C3872: '0x3000': この文字を識別子で使用することはできません

 つまり、「使えない文字が入っている」ということですね。13行目をご覧ください。一見、何がおかしいか分かりませんが、実は、全角スペースが混じっているのです。本問題では、13行目に全角スペースが混じっています。全角と半角の違いは画面上では見えないので、初心者が戸惑う原因の一つです。

5.2 セミコロンの付け忘れ

 次は、以下のエラー・メッセージです。

(16): error C2146: 構文エラー : ';' が、識別子 'i' の前に必要です。

 これは、for文の「i < 10」の最後にセミコロンが付いていないために出るメッセージです。日本語では、文の最後に「。」を付けますが、プログラミングではセミコロンですね。特に、for文は、初めて書く人には分かりにくいため、セミコロンを忘れることがあります。

5.3 ゼロとオーの違い

 次は、以下のメッセージです。

(17): error C2065: 'inO' : 定義されていない識別子です。

 エラーの原因が分かったでしょうか。これは「ゼロ」と「オー」の違いです。宣言では、in0(ゼロ)なのですが、17行目では、inO(オー)となっており、定義していない識別子を使っているとのエラーが出ました。これは、筆者もたまにだまされます。特に、他人のプログラムを写していると、違いが分かりにくいですね。

5.4 「イチ」と「エル」の違い

 以下のメッセージをご覧ください

(17): error C2065: 'numl' : 定義されていない識別子です。

 これは、1(イチ)とl(エル)の違いです。1とlって、非常に見づらいですね。これも見間違うことがあるでしょう。

5.5 プリントエフ?

 学生の「頻出コンパイルエラー」の銀メダルが、printfだと思います※4)。以下のメッセージをご覧ください。

(18): warning C4013: 関数 'prntf' は定義されていません。int 型の値を返す外部関数と見なします。

 よく見ると、prntfとなっています。標準関数も初めてタイプする時は、間違うことがありますね。皆さんも間違えたことがきっとあるはずです。

※4)初心者が間違えるコンパイルエラーの「金メダル」が、「#include<stdio.h>」でしょう。大抵、「#include<studio.h>」とつづりを間違えます。「スタジオ」という英語を連想することも原因でしょうが、そもそもこの構文が何を意味するか知らないまま打ち込んでいることも要因です。

5.6 セミコロンとコロン

 以下のメッセージをご覧ください

(22): error C2143: 構文エラー : ';' が ':' の前にありません。

 これは、returnにセミコロンではなく、コロンを使っているからです。セミコロンとコロンは、よく似ていますし、キーボードの配置もすぐ隣で、間違えることがあります。

6.自己採点シート

 今回の自己採点シートを以下に示します。

問題 内容 配点(点)
線形探索プログラム ソースコードとエラーメッセージを一通り読んだ 40
エラーを見つけた 件数×10
その他のバグを見つけた 件数×5
リスト4 自己採点シート

7.終わりに

 今回は、プログラミングの初心者である学生がよく間違えるコンパイルエラーを埋め込んだプログラムを出題しました。エラーの数が多かったと思いますが、全て分かったでしょうか。難易度の高低※5)はありますが、プロでもコンパイルエラーに頭を悩ますことがあります。今回の問題程度ならば、visual studioやeclipseのようなツールを使うと、エディタ上で指摘してくれます。使ってない方は、是非、活用してください。

※5)テレビや書籍、Webサイトに頻出する表現で、非常に気になるのが「難易度が高い」です。「難度が高い」は、正しい表現で意味が通じますが、「難易度が高い」では、「難度が高い」のか、「易度(こんな言葉はありませんが)が高い」のか不明です。「硬軟度が高い」と書いてあれば、「ダイヤモンドより硬い」のか「豆腐のように柔らかい」のか分からないのと同じですね。とはいえ、言葉は生き物なので、今後50年以上、「難易度が高い」を「非常に難しい」ことの意味で使われ続けると、広辞苑にも、「これは『難度が高い』の誤用から」とただし書き付きで載るはずです。「正しい日本語認定」され、「コンパイルエラー」にはならないでしょう。

【 筆者紹介 】
山浦 恒央(やまうら つねお)

東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)


1977年、日立ソフトウェアエンジニアリングに入社、2006年より、東海大学情報理工学部ソフトウェア開発工学科助教授、2007年より、同大学大学院組込み技術研究科准教授、2016年より非常勤講師。

主な著書・訳書は、「Advances in Computers」 (Academic Press社、共著)、「ピープルウエア 第2版」「ソフトウェアテスト技法」「実践的プログラムテスト入門」「デスマーチ 第2版」「ソフトウエア開発プロフェッショナル」(以上、日経BP社、共訳)、「ソフトウエア開発 55の真実と10のウソ」「初めて学ぶソフトウエアメトリクス」(以上、日経BP社、翻訳)。


Copyright © ITmedia, Inc. All Rights Reserved.

前のページへ |       
ページトップに戻る