- ベストアンサー
C言語のサンプルコードについての解釈に問題があるかどうか
- C言語の勉強中で理解に苦しんでいるが、あるサンプルコードの解釈に問題があるかどうか質問したい。
- サンプルコードの一部を抜粋したもので、whileループの中でcountとdataの値が変化するが、自分の解釈と異なる挙動がある。
- 自分の解釈では、countが100になるたびにoutput(LED[data])が実行されるはずだが、実際には1秒ごとに実行されている。どこに問題があるか教えてほしい。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
01:while(1) 02:{ 03:if(count >=100) 04:{ 05:count = 0; 06:data++; 07:if(data > 9) 08:data = 0; 09:output(LED[data]); 10:} 11:} まず、01のwhileでループになるのは 02から11までです。 「1」はCでは「真」の意味になり、while は 式が真の場合は繰替えすので、このwhileループは永久ループになります。 03のifで、式が真の場合に実行されるのは、04から10までです。 式が偽の場合は04から10を実行しないだけなので、 01から11のループは実行されます。 >1.もし、countの値が100より小さい場合は(略)ループをぬける。 は「ループをぬける」というのが間違いです。 07のifですが、これにより影響を受けるのは 08だけです。 if文の書式は 書式1: if (式) 単文 ; 書式2: if (式) { 単文 ;.... } の2通りあります。 {}が無い場合は、続く1文のみが影響を受けるのです。 間違いやすいところなので、 07':if(data > 9) data = 0; と1行で書くとか 07:if(data > 9) a7:{ 08:data = 0; a8:} と必ず書式2を使うようにするとかするのがよいです。 > if(data>9)もし,dataの値が9より小さい場合は > data = 0 >output(LED[data]) > は実行しない。 data=0を実行しない、は正しいですが、 output(LED[data])は(date>9)に関係なく実行されます。 > 3.とすれば、data++した値が、10にならないとdata =0,とoutput(LED[data])は実行されない。 上の解釈が間違っているので、当然、これも正しくありません。 よって、この部分は countが100以上になる度に 0から9まで順番(9の次は0)に表示する というものです。 全体としては、おそらく、マルチスレッド等でcountを増やしたりする処理と、LED表示だけを行う処理とが並列して動くものなのでしょう。
その他の回答 (1)
- edomin7777
- ベストアンサー率40% (711/1750)
どういう風に抜粋したのか判らないが、 1.もし、countの値が100より小さい場合は if(count>=100)式が成り立たないので それ以降の{}内の処理を実行せず、ループを ぬける。 は間違い。 while(1)が記述通りなら、永久ループ。 2.もし、countの値が100以上の場合は、中のif文を実行した結果countが0になるので、一回だけdataに対する操作が行われて、あとは永久ループ。
お礼
お目にかけて頂いてありがとうございました。 全てのソースコードを記述されなかったので アドバイスにも、困惑されたのでは思われますが、 PICマイコン専用の独特なC言語を使用のため、 標準的なところだけで、ご質問させていただきました。 今、問題のところを、眺めるとedomin7777様の回答頂いた ところも、理解できました。 また、ご教示願えればと思います。 ありがとうございました。
お礼
早速のご回答ありがとうございます。 大変勉強になります。まず、03:のif(count>100)のところで countの値が100以下なら、ループを抜けると記述しましたが、 それ以降の文を実行しないだけで whileループは繰り替えされるところは、理解していたのですが、 ループを抜けると表現してしまいました。 次に07:if(data > 9)の式のところですが、kmee様のお示しどおり、 書式2:if(式){単文}の様に、サンプルコードが if(data>9) { data = 0; } の型になっていたなら、今回の不思議が発生しなかった様に思います。 試しに、if(式){単文}の例題で復習してみると、なるほどif(式)に 影響受けるのは、直下の{文}だけでした。これで、また1つ大切な経験を させて頂きました。それと、全体プログラムの構成は、お見込みのとおり timer0の割込みよりインターバルタイムをカウントし、その回数の判定により 配列に固定された、データを7セグLEDに表示する。while(1)ループでは 0~9表示を繰り返すだけというプログラムです。 すっきり解決したところで、また次の課題に取り組めそうです。 ありがとうございまいした。