RXduinoの開発をしていて、相当悩んだバグを紹介します。
音を鳴らすプログラムです。
Serial.print("C");
tone(tonepin,262,wait) ; // ド
delay(wait) ;
Serial.print("D");
tone(tonepin,294,wait) ; // レ
delay(wait) ;
Serial.print("E");
tone(tonepin,330,wait) ; // ミ
delay(wait) ;
Serial.print("F");
tone(tonepin,349,wait) ; // ファ
delay(wait) ;
Serial.print("G");
tone(tonepin,392,wait) ; // ソ
delay(wait) ;
Serial.print("A");
tone(tonepin,440,wait) ; // ラ
delay(wait) ;
Serial.print("H");
tone(tonepin,494,wait) ; // シ
delay(wait) ;
♪「ドッ レッ ミッ ファッ ソッ ラッ シッ」
と鳴って欲しいのですが、
♪「ドッ レッ ミッ ファソッ ラッ シッ」
のようになってしまって、ファとソの間のdelayが効きません。
さて、なぜだか分かりますか?
正直、このバグには2日間くらい悩まされました。
答えはこちら↓
objdumpで逆アセンブラしてみてようやく気が付きました。
「ソ」の次の行のdelayがオブジェクトファイルから無くなっているのです。
理由はコメントにありました。
tone(tonepin,392,wait) ; // ソ
Shift-JISで「ソ」という文字の2バイト目は制御記号\なので、次の行もコメントとして扱われてしまうのです。
そのため、delay(wait)もコメントアウトされてしまうのです。
tone(tonepin,392,wait) ; // ソ.
とすれば解決です。
良く見ると、GCCのWarningが出ていました。
tone_test.cpp:46:31: warning: multi-line comment [-Wcomment]
そういう意味なんですね。
Shift-JISで2バイト目に\が含まれる文字はほかにもたくさんあります。
皆様もどうかご注意ください。
最近のコメント