解答は、「問題文の文字コード表が間違っており、正しい値を表示できない」です。リスト2-1、リスト2-2をご覧ください。
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0A | 0B | 0C | 0D | 0E | 0F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
00 | ||||||||||||||||
10 | ||||||||||||||||
20 | ! | " | # | $ | % | & | ’ | ( | ) | * | + | , | - | . | / | |
30 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? |
40 | @ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
50 | P | Q | R | S | T | U | V | W | X | Y | Z | [ | \ | ] | ^ | _ |
60 | ' | \ | a | b | c | d | e | f | g | h | i | J | K | l | m | n |
70 | o | p | q | r | s | T | u | v | w | x | y | Z | { | | | } | ~ |
リスト2-1 文字コード表(リスト1-2の再掲で、バグがある) |
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0A | 0B | 0C | 0D | 0E | 0F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
00 | ||||||||||||||||
10 | ||||||||||||||||
20 | ! | " | # | $ | % | & | ’ | ( | ) | * | + | , | - | . | / | |
30 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? |
40 | @ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
50 | P | Q | R | S | T | U | V | W | X | Y | Z | [ | \ | ] | ^ | _ |
60 | ' | a | b | c | d | E | f | g | h | i | j | K | L | m | n | o |
70 | p | q | r | s | t | U | v | w | x | y | z | { | | | } | ~ | |
リスト2-2 正しい文字コード表 |
リスト2-1は、問題で示した間違った文字コード表で、リスト2-2が正しい文字コード表です。この問題で、筆者はわざと文字コード表の0161に本当であれば「a」と書くところに「\(バックスラッシュ)」を仕込んでおきました(赤字で書いた部分がズレている箇所です)。よって、リスト2-1に従って0x62から表示しようとすると、大文字は正しく現れるのですが、小文字はb〜zまでしか表示してくれません。
正しい出力とするには、12行目を「for (i = 0x61; i <= 0x7A; i++」とすると、a〜zまでが現れます。
ASCIコード表は、見慣れているので、中身をちゃんとチェックしないことが多いと思います。読者の皆さんの中には、実際にプログラムを走らせて、「あれ、文字コード表の通りなのに、『a』が出てこないぞ。大文字はキチンと表示されるのに」と不思議に思われた人もいるでしょう。
で、ソースコードを1行ずつチェックしてもバグは見つからず、「ちゃんとコーディングしてあるはずなのに、なぜ、『a』が出てこないんだろう?」と、ちょっとしたパニックになったりします。
この手の「思い込みがからむ」バグは、なかなか分かりません。前日、普通に帰宅すると、「ガソリンタンクが空っぽ」だとは思いません。100円玉がおでこに貼りついてるとは思いませんね。
「文字コード変換表は正しい」と思い込むと、そこから抜け出すのは簡単ではありません。逆に、この仕様に「文字コード表」がないと、自分で調べるので、(0161)から表示するようプログラミングするはずです。余計なものがあったため、起きたバグです。仕様を書いた人は、「小さな親切」のつもりで文字コード表を載せたのでしょうが、「大きなお世話」になってしまいました。
今回の自己採点シートを下記に示します。
問題 | 内容 | 配点(点) |
---|---|---|
文字コード印刷 | 5分以上考えた | 40 |
コード表のバグに気がついた | 40 | |
上記以外のバグを見つけた | 20 | |
リスト3 自己採点シート |
この原稿を送った直後、編集部から、「本文に、『ASCIコード』とありますが、『ASCIIコード』ではありませんか?」との問い合わせが来ました。その通りで、私の恥ずかしい記憶違いですが、「仕様書のバグ」として、そのままにしてもらいました。この記述ミスを見つけた方は、「上記以外のバグを見つけた」として、20点加点してください。
大前提となる「仕様」も疑いましょう。仕様書に掲載してあるテーブルやデータも、たっぷり疑いましょう。この時に、テーブルやデータのバグを見つけておかないと、プログラムの動作は、手品を見るように不思議な動きをします。実生活でもソフトウェア開発でも、恐るべきは「思い込み」ですね。本コラムをきっかけにして、より高いレベルのエンジニアを目指していただければ幸いです。
東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)
Copyright © ITmedia, Inc. All Rights Reserved.