再生モードで再生指令を出して、一時停止モードに遷移できないのは、「正しく代入処理をしていない」ためです。
問題を簡単に振り返りましょう。このプログラムは、ユーザーのコンソール入力に従って、モード遷移をする仕様です。リスト2の実行結果は、次のような手順でモード遷移をしています。
本来、再生モードで再生指令を出すと一時停止になるのですが、再生モードのままです。なぜでしょうか。バグは、以下の黄色で示した部分のソースコードにあります。
黄色で示したソースコードでは、正しい代入処理ができていません。「gMode==MODE_PAUSE;」と書いてあり、値が代入できていません。正しくは、「gMode=MODE_PAUSE;」です。結果として、モードは再生モードのままとなりました。「=」と「==」の書き間違いは非常に多い上に、脳内では無意識に正しく読んでしまうため、なかなか気が付きません。厄介なバグですね。
このバグは、昔、筆者が作り込んだものです。ループの中でモードが変わるプログラムだったのですが、フラグを立ててもモードが変化しません。原因が全く分からず、最後には、「コンピュータが壊れているのではないか?」と疑ったりしました。お恥ずかしい限りです。デバッガを使って、やっとバグに気付きました。
今回の自己採点シートを以下に示します。
問題 | 内容 | 配点(点) |
---|---|---|
音楽プレーヤープログラム | 問題を一通り読んだ | 50 |
正しく代入処理をしていないバグを見つけた | 50 | |
リスト3 自己採点シート |
プログラムを思い通りに作ることは簡単ではなく、皆さんも毎日、悪戦苦闘していると思います。今回は、音楽プレーヤーのプログラムを出題しました。皆さんならこんな初歩的なバグを作らないでしょうが、「終わるはずのループが終わらない」という不可解な現象に遭遇したら、まずは、単純な記述ミスを疑ってください。
組み込みソフトウェアでは、今回のような「モード」に着目すると、実装やテストが楽になることがあります。実装する前に、簡単な状態遷移図を作成すると、より良いソフト開発が可能となるでしょう。
「モダンC言語プログラミング」(花井志生、2013年、KADOKAWA/アスキー・メディアワークス)
東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)
Copyright © ITmedia, Inc. All Rights Reserved.