再生モードで再生指令を出して、一時停止モードに遷移できないのは、「正しく代入処理をしていない」ためです。問題を簡単に振り返りましょう。このプログラムは、ユーザーのコンソール入力に従って、モード遷移をする仕様です。リスト2の実行結果は、次のような手順でモード遷移をしています。1電源OFFモードで、「0(電源ON/OFF指令)」を入力、Enterを押し、アイドルモードに遷移する2アイドルモードで、「1(再生指令)」を入力、Enterを押し、再生モードに遷移する3再生モードで、「2(停止指令)」を入力、Enterを押し、アイドルモードに遷移する4アイドルモードで、「1(再生指令)」を入力、Enterを押し、再生モードに遷移する5再生モードで、「1(再生指令)」を入力、Enterを押し、一時停止モードに遷移するはずが、再生モードのままとなっている6コンソールから入力をせず、Ctrl+cでプログラムを終了する本来、再生モードで再生指令を出すと一時停止になるのですが、再生モードのままです。バグは、以下の黄色で示した部分のソースコードにあります。黄色で示したソースコードでは、正しい代入処理ができていません。「gMode==MODE_PAUSE;」と書いてあり、値が代入できていません。正しくは、「gMode=MODE_PAUSE;」です。結果として、モードは再生モードのままとなりました。「=」と「==」の書き間違いは非常に多い上に、脳内では無意識に正しく読んでしまうため、なかなか気が付きません。このバグは、昔、筆者が作り込んだものです。ループの中でモードが変わるプログラムだったのですが、フラグを立ててもモードが変化しません。原因が全く分からず、最後には、「コンピュータが壊れているのではないか?」と疑ったりしました。お恥ずかしい限りです。デバッガを使って、やっとバグに気付きました。5.自己採点シート今回の自己採点シートを以下に示します。自己採点シート6.終わりにプログラムを思い通りに作ることは簡単ではなく、皆さんも毎日、悪戦苦闘していると思います。今回は、音楽プレーヤーのプログラムを出題しました。皆さんならこんな初歩的なバグを作らないでしょうが、「終わるはずのループが終わらない」という不可解な現象に遭遇したら、まずは、単純な記述ミスを疑ってください。組み込みソフトウェアでは、今回のような「モード」に着目すると、実装やテストが楽になることがあります。実装する前に、簡単な状態遷移図を作成すると、より良いソフト開発が可能となるでしょう。2016年より非常勤講師。“くみこみ”な話」バックナンバーバグ検出ドリル(15)なぜ「山田三郎」が「まだまだ天田三郎」に化けるのかバグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第15回の問題は、「思った通りに動いてくれないプログラム」のバグです。プログラマーに忖度してくれよ!バグ検出ドリル(14)タイポグリセミア現象もびっくり、恐るべきは思い込みバグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第14回の問題は、前回に続いて「煮詰まったバグ」です。煮詰まっているがゆえに、バグの原因が分からなくなる事態に対処してください!バグ検出ドリル(13)のたうち回る地獄、煮詰まったバグを解決せよバグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第13回の問題は、筆者の経験を基にして作った「煮詰まったバグ」です。プログラムが思い通りに動かず「のたうち回る地獄」のような状況に対処してください!バグ検出ドリル(12)コンパイルエラーにならないコンパイルエラーバグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第12回は、前回に引き続き「コンパイルエラー」がテーマです。コンパイルエラーにはならないのに、うまく動かないプログラムのバグを見つけ出してください!バグ検出ドリル(11)コンパイルエラーは意外に難しいバグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第11回では、初心者が苦労する「コンパイルエラー」がテーマです。SNSfacebooktwitterITmediaはアイティメディア株式会社の登録商標です。