C言語の乱数プログラムにおけるデバッグエラーの原因とは?

このQ&Aのポイント
  • C言語の乱数プログラムで、コンパイル時にはエラーが出ないが実行時にデバッグエラーが出る理由は何でしょうか?
  • プログラムの中で、特定の関数の呼び出しによって変数の値が変わることが原因でデバッグエラーが発生しています。
  • 具体的には、関数testによって変数bに値が代入され、それが変数aに代入されたことが原因です。なぜこれが問題となるのか詳しく説明してください。
回答を見る
  • ベストアンサー

このプログラムを見てください(C言語) m( _ _ )m

現在乱数を使ったプログラムを作っています。 下のプログラムでコンパイルではエラーがでませんが、実行するとデバッグエラーが出てきます。コンパイラにはbccを使っています。恐らく原因は別の関数でbに値を代入してそれをaに代入しているからだろうと思いますが、なぜこれがいけないのかが分かりません。 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <conio.h> int ran, a=1, b, c; void test(void){ b=8; } void main(){ srand(time(NULL)); a=b;//ここを無くすとなぜかエラーが出ない。 while(1){ ran=rand()%(a*2)+1; switch(ran){ case 1: c=1; break; case 2: c=1; break; case 3: c=1; break; case 4: c=2; break; case 5: c=2; break; case 6: c=3; break; case 7: c=3; break; case 8: c=4; break; } printf("%d",c);printf("何か押してください\n");getch(); } }

質問者が選んだベストアンサー

  • ベストアンサー
  • driverII
  • ベストアンサー率27% (248/913)
回答No.1

a=b の実行時に変数bが参照されますが、 値が不定です。 test()がa=b以前に実行されていればOKです。

amazontester
質問者

お礼

あっ! これは初歩的なミスを・・。ずっと考えて分からなかったです。ありがとうございました。

関連するQ&A

  • c言語についての質問です。

    #include<stdio.h> int main(void){ double a,b; int c; printf("Type two numbers\n"); scanf("%lf",&a); scanf("%lf",&b); printf("Select 1)addition, 2) subtraction, 3)multiplication or 4)division\n"); scanf("%d",&c); switch(c){ case1: printf("%.6f + %.6f = %.6f",a,b,a+b); break; case2: printf("%.6f - %.6f = %.6f",a,b,a-b); break; case3: printf("%.6f * %.6f = %.6f",a,b,a*b); break; case4: printf("%.6f / %.6f = %.6f",a,b,a/b); break; default: printf("Error! Select 1, 2, 3 or 4\n"); break; } return 0; このプログラムをコンパイルして実行しても 正しく動きません。なぜですか?

  • C言語プログラム

    したのプログラムでgetch()の代わりにscanf()を使って、入力した数が負なら終了、正なら"次の数を入力してください"と表示してループを続けるプログラムを作りたいのですが、どこを変えればよいのですか? #include<stdio.h> #include<conio.h> void main() { int i=1,sum=0; char c='m'; while(c!='e')//eでない限りwhileループを実行する { sum=sum+i; printf("\n1 kara %d madewo tasuto %d desu.\n",i,sum); i++; printf("nanikakeywo oshitekudasai.owaru tokiha 'e'\n"); c=getch(); } printf("loopwo nukemashita\n"); getch(); }

  • C言語エラー

    C言語をいじっているのですが、16行目と19行目の「型」の前に「;」がありませんと表示されます。 どこをどう改善すればいいか教えてもらえないでしょうか /*遊び半分*/ #include <stdio.h> #include <process.h> int main() { char dear; printf("ああああ\n"); printf("ああああ \n"); scanf_s("%c", &dear); switch (dear){ case 'A04': ; int main(void); { printf("ああああ\n"); int main(void); printf("あああ\n"); printf("あああ\n"); break; system("pause"); return 0; } case 'C34' : printf("\n"); break; case 'E24' : printf("\n"); break; case 'F38' : printf("\n"); break; default: printf("メッセージはありません\n"); break;} return 0;

  • C言語 

    C言語でAとBがじゃんけんをして勝ち負けを出力するプログラムをつくりたいのですが、間違いを教えてください。(AがgでBがcならAの勝ち。AがgでBがpならBの勝ち。AがgでBがgなら引き分け。) #include<stdio.h> #include<conio.h> void main() { int A,B; printf("文字を入力せよ"); scanf("%d",&A); scanf("%d",&B); if(A=='g'||B=='c') { printf("Aの勝ち"); } if(A=='g'||B=='p') { printf("Bの勝ち"); } if(A=='g'||B=='g') { printf("引き分け"); } getch(); }

  • C言語-エラーの位置

    いろんなものを見ながらじゃんけんのプログラムを作ったのですが、 どうしても最後でエラーが出てしまいます。 その原因がどうしてもわかりません。 エラーの出る部分は、最後の「}」、「return」ですが・・・。 以下がプログラムです。(printf内の\nは省略してます) この場合、}とreturnの位置はどうすればいいでしょうか? #include<stdio.h> #include<stdlib.h> #include<time.h> int main() { int player_hand,cpu_hand_result; srand((unsigned) time(NULL)); do{ printf("1:グー 2:ちょき・・・・"); scanf("%d",&player_hand); if(player_hand<1 || player_hand>3)result-1; player_hand--; cpu_hand = rand()%3; switch(cpu_hand){ case 0:printf("グー"); break; case 1:printf("チョキ"); break; case 2:printf("パー"); break; } result-(cpu_hand-player_hand+3)%3; if(result==2)result=-1; switch(result){ case 1:printf("あなたの勝ち"); break; case -1:printf("あなたの負け"); break; case 0:printf("あいこ"); break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  • C言語プログラム

    2つの整数を入力させ、それらが等しい場合hitoshii、異なる場合にはhitoshikunaiと出力するプログラムを作りたいのですが、うまくいきません。間違っているところを教えてください。 #include<stdio.h> #include<conio.h> void main() { printf("整数を入力してください:"); int number1; scanf("%d",number1); printf("整数を入力してください:"); int number2; scanf("%d",number2); if(number1==number2) { printf("hitoshii"); } else { printf("hitoshikunai"); } getch(); }

  • c言語のプログラムについて

    今年からC言語を始めた大学1年生です。レポートで四則計算を行うプログラムを6/19までに作らないといけないです。使えるのは今までに習った選択型、反復型、関数scanfです。このプログラムの留意点は次の4つです。 1.使う演算を選択してもらう   例えば   どんな演算をしますか? 1:+,2:-,3:*,4:/ (選択) 2.演算を行う数値を入力してもらう   例えば   a + b の計算をします。aを入力してください。 3.演算結果を表示する   ○+○の答えは ○です 4.計算終了か、それともほかの演算を行うか 決める   0:計算終了 1:他の計算を行う を選択してください  以下のプログラムはこのことを留意してプログラムをつくりました。どこがおかしいのでしょうか。 #include<stdio.h> main() { short a,b,m,n; long c,d,e,f; c = a + b; d = a - b; e = a * b; f = a / b; m = 1; printf("整数を入力してください:"); scanf("%d",&a); printf("どんな演算をしますか?:"); printf("1: +,2: -,3: ×,4: ÷ :"); scanf("%d",&n); while(m=1){ if(n<=4){ while(m=1){ switch (n<=4){ case 1: printf("整数を入力してください:"); scanf("%d",&b); printf("%d + %d = %d \n",a,b,c); break; case 2: printf("整数を入力してください:"); scanf("%d",&b); printf("%d - %d = %d \n",a,b,d); break; case 3: printf("整数を入力してください:"); scanf("%d",&b); printf("%d × %d = %d \n",a,b,e); break; case 4: printf("整数を入力してください:"); scanf("%d",&b); printf("%d ÷ %d = %d \n",a,b,f); break; } } } else { printf("計算できません。"); printf("演算をやり直してください。\n:"); } } printf("計算を終了しますか、それとも他の計算を行いますか?:"); printf("0:計算終了,1:他の計算を行う:"); scanf("%d",&m); printf("計算を終了します。\n"); } 提出期限があるのでなるべく早めのご回答待ってます。生意気言ってすいません。

  • プログラミング言語Cの演習

    以下のようにプログラミングをしてコンパイルしても特にエラーは無かったのですが・・・、実行しようとするとセグメンテーション違反になってしまいます。誰か分かる方がいたら解答かアドバイス欲しいです。 #include <stdio.h> #include <math.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define MAXOP 100 #define NUMBER '0' #define MAXVAL 100 #define BUFSIZE 100 int getop(char s[]); int getch(void); void ungetch(int c); void push(double f); double pop(void); int sp = 0; double val[MAXVAL]; char buf[BUFSIZE]; int bufp = 0; main() { int type; double op2; char s[MAXOP]; while ((type = getop(s)) != EOF) { switch (type) { case NUMBER: push(atof(s)); break; case '+': push(pop() + pop()); break; case '-': op2 = pop(); push(pop() - op2); break; case '/': op2 = pop(); if (op2 != 0.0) push(pop() / op2); else printf("error: zero divisor\n"); break; case '%': op2 = pop(); if (op2 != 0.0) push(fmod(pop(), op2)); else printf("error: zero divisor\n"); break; case '\n': printf("\t%.8g\n", pop()); break; default: printf("error: unknown command %s\n", s); break; } } return 0; } int getop(char s[]) { int c, rc; float f; while ((rc = scanf("%c", &c)) != EOF) if ((s[0] = c) != ' ' && c != '\t') break; s[1] = '\0'; if (rc == EOF) return EOF; else if (!isdigit(c) && c != '.') return c; ungetc(c, stdin); scanf("%f", &f); sprintf(s, "%f", f); return NUMBER; } void push(double f) { if (sp < MAXVAL) val[sp++] = f; else printf("error: stack full, can't push %g\n", f); } double pop(void) { if (sp > 0) return val[--sp]; else { printf("error: stack empty\n"); return 0.0; } } int getch(void) { return (bufp > 0) ? buf[--bufp] : getchar(); } void ungetch(int c) { if (bufp >= BUFSIZE) printf("ungetch: too many characters\n"); else buf[bufp++] = c; }

  • C言語で直角三角形の斜辺を求めるプログラムについて

    「二辺の長さが与えられているとき、斜辺の長さを求めよ」という問題です。 #include <stdio.h> #include <math.h> #define a 3 #define b 4 int main (void) { double c=0; c=sqrt(a*a+b*b); printf("%f",c); return 0; } visual2010c++で作ったんですが、sqrtに下線がついて、コンパイルエラーしちゃいます。 すんごい初歩的なことなんだと思いますが、どこなのか気づけません。 どなたかよろしくお願いします。

  • C言語のwhile文を使った素数判定プログラムで…

    次に示すプログラムは、100までの素数を表示するものです。 見てのとおり、C言語のwhile文を使って書いてあります。 #include <stdio.h> int main(void) { int a, b; int flag = 0; a = 2; b = 2; while(b <= 100){ *ここ* while(a < b){ if(b%a == 0){ flag = 0; break; } else{ flag = 1; } a++; } if(flag == 1){ printf("%dは素数\n", b); } b++; } getch(); return 0; } 最初、手本を参考にしながら上記のように書きましたが、うまく機能せず、3から100までの数字すべてが素数であると表示されました。 どこが間違っているのかと、手本と厳密に見比べてみたら、8行目の a = 2 が*ここ*と書いてある場所に書かれていました。 まさかないだろうと思いつつ、もとあったのを消して*ここ*に書き換えたら、正しく素数が表示されるようになりました。 値を代入する場所が違うだけで、なぜこのような違いが起こるのか全く理解できません。 教えてください。 (一応、書いておきますが使っているコンパイラはBorlandのやつです コンパイラのせいってことはないですよね)