勘違いかもしれませんが、もしかしたらそういう特性があるかもしれないので、メモしておきます。
問題のプログラム
今回Arduinoをいじっていて1か所納得がいかないところがありました。
全部乗せると長いので一部分を以下に載せます。
if(pass_count==PASS_SIZE){
int flag=0;
while(i<PASS_SIZE){
if(pass_rev[i]!=passcode[i]){
flag=-1;
//break文と近すぎると、なぜか抜けてしまう模様。
Serial.print("ブレイク前のflag=");
Serial.println(flag);
break;
}else{
flag=1;
}
i++;
}
if文とwhile文で構成された単なるフラグ判定のためのプログラムなんですが、問題は以下の部分です。
if(pass_rev[i]!=passcode[i]){
flag=-1;
//break文と近すぎると、なぜか抜けてしまう模様。
Serial.print("ブレイク前のflag=");
Serial.println(flag);
break;
}
この一つ目の条件分岐において、break文が実行される直前までは、上のプログラムは全て実行されるはずなのですが、
flag=-1;
の代入が不発に終わることがありました。
これ以前ではフラグは利用していないので、特に悪影響等を及ぼされている可能性は低いと思うのですが、いろいろ調節してもうまくいきませんでした。
Arduinoの処理自体流れるように進むので、もしかしたら速すぎて代入できてない?のかもしれません。
修正したプログラム(一応うまくいきました。)
一応以下のようにdelayをはさんでタイムラグを設けてやるとうまくいきました。
if(pass_rev[i]!=passcode[i]){
flag=-1;
delay(100);
Serial.print("ブレイク前のflag=");
Serial.println(flag);
break;
}
ただこれでもあんまり納得いかないんですよね。
flag判定が上手くいかないからdelayを入れるのは分かるんですが、flagの後ろに入れてるのにうまくいってしまうんですよねぇ、、、
全く謎です。。。
ちなみにSerial.print関係はしっかり表示されるので、これもまた謎ですね、、
たまたまハード的に行けない部分なのか、ほかの部分で悪さされているのか、、よくわかりません。
原因が分かる方がいれば教えていただきたいところですね。
コメント
今回はよくわからないバグ?でした。
バグなのかもわかりませんが。
ただ今後代入などが上手くいかないことがあったらこういうケースもある、ということで、頭に入れておきたいと思います。
理由が分かったら修正投稿します。
それでは。