• 締切済み

教えてください

do~while文のループの中にの処理に対して質問させください。 do{ if (Count!=ReceivedCount){ Count = ReceivedCount;   } if (ReceiveData_i==0x51){ break; } }while(ReceiveData_i!=0x51); print("\r\nBye Bye!!\r\n"); 1: Count = ReceivedCountの処理が実行されない。   Count!=ReceivedCountの値は、違います。 2:ReceiveData_i==0x51で、ReceiveData_iが0x51なのに、  breakが実行されない。 3:do~while文から抜け出せないので、print文が実行されない。  ReceiveData_iが0x51です。 何か考えられる原因はありますでしょうか。

  • 0008o
  • お礼率0% (0/10)

みんなの回答

  • Alice022
  • ベストアンサー率37% (3/8)
回答No.4

ざっと見た感じではコード記述に問題ない気がするのですが、処理判断で内容が該当しているのに処理が行われないという点が気になります。 例えば、ReceiveData_iが0x51であるのにbreakが実行されない。 確認したいのですが、ReceiveData_iは0x51であるということですが、デバッガのウォッチで見ているときの表示は16進でしょうか?10進表示で見てしまっているということはないのですよね?

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

Count ReceivedCount ReceiveData_i 上記の変数を定義している箇所を提示してください。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

>  Count!=ReceivedCountの値は、違います。 日本語として通じないのですけれど、どういう意味でしょうか? Countの値とReceivedCountの値とが異なる、という意味でしょうか? もしそういうことなら、どのようにして確かめられましたか? >2:ReceiveData_i==0x51で、ReceiveData_iが0x51なのに、 ReceiveData_iの値が0x51であることを、どのようにして確かめられましたか?

0008o
質問者

補足

>Count!=ReceivedCountの値は、違います。 Countの値とReceivedCountの値とが異なるという意味です。 >2:ReceiveData_i==0x51で、ReceiveData_iが0x51 デバッガで値を確認しました。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

ReceiveData_iとかの値は、whileループ内で更新してないけど何処で更新してますか? もし更新が割り込みやスレッドなら、ReceiveData_iにはvolatileが付いてますか?

関連するQ&A

  • ご教示ください。

    ご教示ください。 javaのfor文を用いたループ処理についてです。 for( int i = 0; i < 10; i++){ System.out.print( i ); if ( i == 3){ break; } 結果 0123 ----------------------------------------------- for( int i = 0; i < 10; i++){ if ( i == 3){ break; } System.out.print( i ); 結果 012 後者の、012になる結果はわかります。 breakをすることで、3以降のループ処理から離脱するということは理解できるのですが、前者が理解できません。 0123 なぜ、3が表示されているのでしょうか。 よろしくお願いいたします。

  • swith文について

    こんにちは。 switch文を用いて分岐を行っています。 以下のプログラムは、whileの無限ループ内にswitch文の分岐を行っています。while内にrecvfrom関数(ソケット通信用関数)を用いています。recv_Buf配列内をヌル文字まで走査し、文字列の長さによって分岐をしています。 while内のrecvfromによって、他端末から文字列を逐次受信しているのですが、この場合、switch文ではなくif文による分岐を行うべきなのでしょうか? また、breakを行うことで、whileの無限ループまで抜けることになるのでしょうか? switchの場合、breakを用いないと、実行したくないところまで実行してしまう可能性があるので、breakは必要だと思い以下のプログラムにしました。 よろしくお願いいたします。 [プログラム] while(1){   recvfrom(s2, recv_Buf, (int)sizeof(recv_Buf) - 1, 0, (SOCKADDR *)&from, &fromlen);   while(recv_Buf[len]!='\0')   len++;   switch(len){    case 3:     if(memcmp(recv_Buf,"END",3) == 0){      //処理     }     break;    case 5:     if(memcmp(recv_Buf,"START",5) == 0){      //処理     }     break;     case 12:     case 13:     case 14:     case 15:      if(memcmp(recv_Buf,"SEND_PACKET",11) == 0){       //処理      }      break;    } }

  • do - while 文

    以下のコードをコンパイル後実行すると、0~9までの出現回数がわかるのですが、処理を続けますか?と出た後yを入力するともう一度 do 以降を実行するようにしたいのですが、yを入力する前にプログラムが終了してしまいます。何がいけないんでしょうか? #include <iostream> using namespace std; int main (void) { int i; char cont; char c; int count[10] = {0}; do{ while (cin.get(c)){ switch (c){ case '0': count[0]++; break; case '1': count[1]++; break; case '2': count[2]++; break; case '3': count[3]++; break; case '4': count[4]++; break; case '5': count[5]++; break; case '6': count[6]++; break; case '7': count[7]++; break; case '8': count[8]++; break; case '9': count[9]++; break; } } for (i =0; i < 10; i++) cout << i << "の出現回数は" << count[i] << "\n"; cout <<"処理を続けますか?(y/N)"; cin >>cont; }while (cont == 'y'); }

  • 3件目以降出力されないので4件目から出力したい

    <!--ループ1--> <?php $wp_query = new WP_Query(); $args = array( 'post_type' => "post", //投稿タイプ設定 ); $wp_query->query($my_posts); if ($wp_query->have_posts()) : $i = 0; $i <= 10; while ($wp_query->have_posts()) : $wp_query->the_post(); ?> <?php /**** ▼1件分の投稿内容HTML ****/ ?> <?php $i++; ?> <?php if ($i >= 3) break; ?> <?php endwhile; ?> <?php endif; ?> <!--//ループ1--> <!--ループ2--> <?php $wp_query = new WP_Query(); $args = array( 'post_type' => "post", //投稿タイプ設定 ); $wp_query->query($my_posts); if ($wp_query->have_posts()) : while ($wp_query->have_posts()) : $i<=4; //iが4より小さい時は、while内のループ処理を実施する $i>3;break; //iが3より大きい時は、while文を・強制終了する $wp_query->the_post(); ?> <?php /**** ▼1件分の投稿内容HTML ****/ ?> <?php $i++; ?> <?php endwhile; ?> <?php endif; ?> <!--//ループ2--> 変数 i の値が 0 から → $i = 0 10 未満の間は、 → $i <= 10 i の値を1づつ加算しながら → i++ 以下の命令文を実行する。 continue; echo $i; //以降の処理をスキップして、次のループ処理を行う。 0から3まででbreakして, $i<=4; //iが4より小さい時は、while内のループ処理を実施する $i>3;break; //iが3より大きい時は、while文を強制終了する 3件で出力を止めたんですが、4件目から出力されません

    • ベストアンサー
    • PHP
  • unsigned型のビット構成を表示するプログラムが理解できません。

    unsigned型ビット構成の表示プログラム #include<stdio.h> int count_bits(unsigned x) { int count=0; while(x){ if(x&1U)count++; x>>=1; } return(count); } int int_bits(void) { return(count_bits(~0U)); } void print_bits(unsigned x) { int i; for(i=int_bits()-1;i>=0;i--) putchar(((x>>i)&1U)?'1':'0'); } int main(void) { unsigned nx; printf("非負の整数を入植してください。:"); scanf("%u",&nx); print_bits(nx); putchar('\n'); return(0); } このプログラムで10を入力したら、00000000000000000000000000000001010と表示され。 18だと00000000000000000000000000000010010と表示される原理が理解できません。 自分なりにプログラムを追ってこういう考えてます。 まず、10を入力したらcount_bitsの関数の処理からスタート。 while(x){ if(x&1U)count++; x>>=1; if(x&1U)の処理を行い。x=10はbit単位表示で、1010として考え。一番右側の101「0」とunsigned型の1との論理比較を行う。0と1なので偽で何もせずにif文を抜けて、x>>=1;を行いx=0101となり。while(x)から再びif(x&1U)行う。x=0101の一番右側のunsigned型の1との論理比較を行い0と1なので真なのでcount++を行いcount=1としてif文を抜け、x>>=1;を行いX=0010になり。三度目のif(x&1U)の処理を行う。0010の一番左側のunsigned型の1との論理比較を行い0と1なので偽でif文を終了。x>>=1;を行い0001となり、再びif(x&1U)行う。 00 01の一番左側のunsigned型の1との論理比較を行い0と1なので真なのでcount++を行いcount=2となり、x>>=1;を行い0000なのでwhile(x)を抜けて返り値2をint_bitsへ返して関数は終了 int_bitsではunsinged型の2が戻り値としてprint_bitsへ返し、int_bitsの関数は終了。 print_bitsの処理が始まり。for(i=int_bits()-1;i>=0;i--)の処理がスタート。 i=int_bits()-1の処理でiは2-1でi=1からスタート。 putchar(((x>>i)&1U)?'1':'0');の処理。 (x>>i)でx=10,i=1なので1010>>1だから0101。 0101の一番右側の1とunsigned型の1と論理比較を行う 真なのでputcharは'1'を一度表示。 for文に戻りiをデクリメントとしてi=0なのi>=0から 一度、putchar(((x>>i)&1U)?'1':'0');処理。 (x>>i)は0101>>0の0右シフト行い0101。 unsignedと1を0101の一番右側の1と論理比較を行う 真なのでputcharは'1'を一度表示。 for文に戻りiをデクリメントとしてi=-1なのでi>=0からfor文を終了してprint_bitsの処理を終了。mainの関数処理に戻り。putchar('\n');を出力して関数処理は終了。表示として「11」が表示される。18も同様に考えているので、「11」が表示されてしまうのでは?という考えに陥ってます。実際は、両方とも正しくunsigned型ビット構成の表示されるので、自分の考え方が間違えている。なのですが、どう間違えているかがわかりません。 多少説明文の省略しているためわかりにくいかもしれませんが、間違えを指摘していただけないでしょうか?

  • ファイル中のデータの読むとき・・・・

    こんにちは。ファイルにあるテキストデータを用意してそれを読み込んでいって、処理をするというプログラム書いてるんですけど、たとえば 大まかな構造として、 int fncCheck(char*pch,char item) { int count=0; int i=0; for(i=0;i<strlen(pch);i++) {if(pch[i]==item) { count++; } } return count; } int main() { FILE *fin,*fout;  //ここでいろいろ宣言 if((fin=fopen("Thermoplasmaacidophilum ","r"))==NULL) { cout<<"No files exist in current directory!\n"; exit(-1); } if((fout=fopen("Thermoplasmaacidophilum _out","wb"))==NULL) { cout<<"Output file can't open!\n"; exit(-1); } if((fin=fopen("Thermoplasmaacidophilum ","r"))!=NULL) { fwrite(SMF_header,14,1,fout); fwrite(SMF_firsttrack,36,1,fout); fwrite(SMF_track,13,1,fout); do {    //ここにdoに関する処理 } while(numread==100); while(c=fscanf(fin,"%c",c)!=EOF) {   //ここに処理をずらずら } printf("There are %d bases!!\n",n); fclose(fin); fclose(fout); } return 0; } ・・・のように書くと、一つ目のdo-while文は実行されるんですが、二つ目のwhile文が実行されません。一回目でファイルのデータを最後まで読んでるので、元にもどってもう一回やってくれないんでしょうか?初心者なものでそこらへんがよくわかんないんですが・・。どなたか助けてください。

  • break文の処理について。

    #include<stdio.h> #define MAX 1000 main(){ int i = 0; int sum = 0; int ary[MAX]; puts("整数を入力してください"); ----------------------------------------- while(i < MAX){ printf("No.%d:" , i+1); scanf("%d" , &ary[i]); if(ary[i] == 9999){ i++; break ; } sum += ary[i]; i++; } ------------------------------------------ if(i > 1){ printf("合計は%dで平均は%.2fです\n" , sum , (double)sum/(i-1)); } return; } -------で区切っている部分になりますが、 配列aryの値に9999が入ると、breakでifとwhileのループを抜けることになりますが、 ここのbreakについては、ifだけにかかるのではと思っております。 このソースが書いてある解説には「多重ループの繰り返し文の内側の繰り返し文の中で、 break文が使われるとその繰り返し文から抜け出ることになります。」と記載されており ます。 多分ですが、ifは繰り返し文ではないため、whileを抜け出すことができるのではと 思っているのですが、確認のためご教授の程お願い致します。

  • javascript 【continue 使い方】

    以下の文は、は無限ループでエラーになるのでしょうか?また、continueを使った、この問題の正しい書き方を教えていただきたいです。よろしくお願いします。 【問題】while文を使用して、変数i=1~100までのうち、7で割り切れる数字を、変数countに全て足したらいくつになるか計算して、それをoutput()で出力する。 _______________________________________________________________________ var i = 1; var count = 0; while(i<=100){ if(count%7!=0){ continue; i++; } count+=i; i++; } output(count); ___________________________________________________________________

  • break文でループを一気に抜けるには

    break文でループを一気に(2個以上) 抜けたい場合はどのようにすればいいのでしょうか? たとえば下のプログラムで1から2に抜けたい すなわちifとforの2つの中括弧を同時に抜けたい場合には どうやってbreak文を記述すればいいのでしょうか? (goto文は使わないということでお願いします。 int k=0; int i; for (i=1;i<10;i++){   k++;   printf("%d",k);   if (k == 5){     printf("a");     break;・・・・・・・・・1→   } } printf("finish");・・・・・・・・・2←

  • perl:ループのカウンタ変数の値を保持したい。

    While文のループのなかにfor文でループをまわしているスクリプトなのですが、 forの中でカウンタ変数をつくり、ループ回数を計測しております。 またforの中である条件を満たした際に、lastでforを抜け、引き続きWhileのループを継続するという処理をしております。 $i=0; While(○○){ 処理1    for(××){ 処理2 $i++;      if($i >=100){  処理3       last; } } } ここで、一度for文のif文で一度forループを抜け、Whileでループをし、またforループに突入した際に、前回forループでカウントした$iの値を保持したまま、そのつづきから$iのカウンタを動作させたいのですが、$iの値はforループを抜けるとリセットしてしまいます。 このような場合、どうすれば$iの値を保持できますでしょうか。 お詳しい方、宜しくお願い致します。 ※ネストがうまく表現できず、みずらくてスミマセン。

    • ベストアンサー
    • Perl