原因は、「breakが抜けている」でした。
問題を振り返ります。ユーザーは、以下の手順で入力しています。
本来、再生モードで再生指令を入力すると一時停止になるのですが、再生モードのままです。なぜでしょうか。原因は以下の場所にあります。
上記の「// アイドルモードの場合」の真上をご覧ください。再生モードのswitch-caseにbreakが抜けていますね。switch文にbreakが無い場合は、下の条件文も実行します。その結果、再生モードで「一時停止モード」に遷移しても、アイドルモードで「再生モード」に遷移してしまいます(黄色で示した部分を参照)。
switch文を使用する場合は、一般的にcaseとbreakをセットにして記述します※2)。breakを記述しない場合は、次のcaseを実行してしまうため、正しい処理が出来ません。
※2)プログラマーによっては、わざとbreakを記述しないで処理をする場合もあります。
「==」やswitch-caseのバグを防ぐためには、デバッグ時にしっかり確認しておくか、違う実装方法に変更するとよいかと思います。たかが「break」の記述ミスですが、ミスなくプログラムをするのは簡単ではありませんね。
今回の自己採点シートを以下に示します。
問題 | 内容 | 配点(点) |
---|---|---|
音楽プレーヤープログラム | 問題を一通り読んだ | 50 |
switch文にbreakが抜けていることを見つけた | 50 | |
リスト3 自己採点シート |
プログラムは考えた通りに動くのではなく、作った通りに動きます。プログラマーは、毎日、このギャップに悪戦苦闘しているはずです。今回は、前回に引き続き、音楽プレーヤーのプログラムを出題しました。Breakの抜けは初歩的なバグですが、「よくある単純バグ」として有名ですね。皆さんは、こんなバグを作らないと思いますが、保守で他人のプログラムに手を入れる場合、switch-caseを見たら、breakがちゃんとあるか、ぜひ、確認してください。
東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)
Copyright © ITmedia, Inc. All Rights Reserved.