バグ検出ドリル(11)コンパイルエラーは意外に難しい:山浦恒央の“くみこみ”な話(111)(3/3 ページ)
バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第11回では、初心者が苦労する「コンパイルエラー」がテーマです。コンパイラが指し示すエラーの箇所から、バグを見つけ出してください!
5.解答
下記に解答を示します。
- 13行目に全角スペースが入っている
- 16行目「i<10」にセミコロンが入っていない
- 17行目「inO」がinO(オー)となっている
- 17行目「numl」がnuml(エル)となっている
- 18行目「prntf」となっている
- 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年以上、「難易度が高い」を「非常に難しい」ことの意味で使われ続けると、広辞苑にも、「これは『難度が高い』の誤用から」とただし書き付きで載るはずです。「正しい日本語認定」され、「コンパイルエラー」にはならないでしょう。
東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- ≫連載「山浦恒央の“くみこみ”な話」バックナンバー
- バグ検出ドリル(10)“昔のバグ”は生命力が最強
バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第10回では、生命力最強という“昔のバグ”がテーマです。前回の第9回で扱った迷路探索プログラムの改造版からバグを見つけ出してください! - バグ検出ドリル(9)デバッグの基本的な心構えは「人を見たら泥棒と思え」
バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第9回では、比較的大きなソースコードである迷路探索プログラムに潜むバグを見つけ出してください! - バグ検出ドリル(8)電卓プログラムのような小さなプログラムにもバグがいる
学生プログラミングの課題となるような小さいプログラムでもバグが潜んでいます。「バグ検出ドリル」の第8回では、学生が5分で書けるような電卓プログラムに潜むバグを見つけ出してください! - バグ検出ドリル(7)やっぱり、いろんなところにバグがいる!
重要顧客の前でデモを行う際にバグが発生すると大変です。顧客だけでなく、自社の社長まで同席していたいたときなどは、さらにものすごく焦るのではないでしょうか。「バグ検出ドリル」の第7回では、そんな状況を想定しつつ、いろんなところに潜むバグを見つけ出してください! - バグ検出ドリル(6)いろんなところにバグがいる! 2分探索法の問題
「バグ検出ドリル」の第6回で出題するのは「2分探索法」の問題です。ソフトウェア技術者の誰もが心得ておくべき常識的なアルゴリズムである2分探索法ですが、今回の問題では、いろんなところにバグがあります。問題文から、どこにバグがありそうか見つけ出してみよう!