前提・実現したいこと
C言語で、0~任意の整数未満の整数をランダムに出力するプログラムを作りました。
(二次元配列のインデックスを取得する基礎実験。ホビー目的。)
・MSYSはWindowsに特化しているとの情報もあるので、可能ならMlngGW-w64等のフリーでWindowsに対応したなるべく汎用性のあるコンパイラーを使いたいです。
・コンパイル時の-static
オプションは、実行ファイルが大きくなるらしく、なるべく使用したくありません。
プログラムを実行すると、以下の問題が発生しました。
解決方法をお教え頂けるでしょうか。
発生している問題・エラーメッセージ
エラーは、1回目のループで発生する場合や、数回のループで発生する場合がありますが、
id[1]=cordnt(scl);
で呼び出されたcordnt
関数のc=r%scl;
で発生する様です。
変数scl
に入力する値の小ささに比例して、エラーが発生するまでのループ回数が小さくなる様です。(変数scl
は、scanf("%d%*c",&scl);
で入力)
実行ファイルをコマンドプロンプトで実行しています。
エラーは、Windowsより
MsgBox
1a.exeは動作を停止しました 2 3問題が発生したため、プログラムが正しく動作しなくなりました。プログラムは閉じられ、 4解決策がある場合はWindowsから通知されます。 5```が表示され、プログラムが終了します。 6 7### 該当のソースコード 8```C 9#include <stdlib.h> 10#include <stdio.h> 11#include <math.h> 12#include <time.h> 13#include <string.h> 14 15// scale:規模 16 17int cordnt(int scl) { 18 int r,c; 19 char s[2][30]; 20 21 r=rand(); 22 23 strcpy(s[0],"random:"); 24 printf("%s%d\t",s[0],r); 25 26 c=r%scl; 27 28 strcpy(s[0],"c=r%scl; is finished."); 29 printf("\n\t%s\n",s[0]); 30 31 strcpy(s[1],"coordinate:"); 32 strcpy(s[0],"strcpy(s[1],coordinate:); is finished."); 33 printf("\t%s\n",s[0]); 34 printf("%s%d\n",s[1],c); 35 36 return c; 37} 38void driver() { 39 time_t t; 40 int scl,r,tt,id[0]; 41 char s[6][10]; 42 43 44 time(&t); 45 46 strcpy(s[0],"t:"); 47 printf("%s%I64d\t",s[0],t); 48 49 50 tt=(int)t; 51 r=tt%32767; 52 53 strcpy(s[1],"seed r:"); 54 printf("%s%d\n",s[1],r); 55 srand(r); 56 57 strcpy(s[2],"scale:"); 58 printf("%s",s[2]); 59 scanf("%d%*c",&scl); 60 61 strcpy(s[5],"scl:"); 62 printf("\n%s%d\n",s[5],scl); 63 64 65 id[0]=cordnt(scl); 66 67 strcpy(s[3],"id[0]:"); 68 printf("%s%d\n",s[3],id[0]); 69 70 71 id[1]=cordnt(scl); 72 73 strcpy(s[4],"id[1]:"); 74 printf("%s%d\n",s[4],id[1]); 75 76} 77void main() { 78 int c; 79 char *s="continue?(Y/y)"; 80 81 do { 82 driver(); 83 printf("%s",s); 84 } while ((c=getc(stdin))==89 || c==121); 85}
試したこと
・「a.exeは動作を停止しました。の直し方を教えてください。」を参照し、printf
の内容を見直しました。
・コンソールから変数scl
に入力する際、scanf("%d%*c",&scl);
に%*c
を加え\n
のバッファへの入力を予防しました。
・「GCC(G++)でC++をコンパイルすると動作が止まった」を見ましたが、MSYSと-static
オプションは試していません。
補足情報(FW/ツールのバージョンなど)
入力値
scanf("%d%*c",&scl);
に対し「3」(数を大きくすると)
コンパイラー等
・MingGW-w64(SOURCEFORGE/gcc ver.7.2.0/MingGW-w64 ver.5.0.3)
・コンパイル・リンク:マイドキュメント配下の任意のフォルダ
(任意のフォルダとするため「mingw-w64.bat」のコピーを改変し使用)
システム
・Windows10 Home 64bit
・Acer Aspire 5750
・intel Core i5-2430M CPU 2.40GHz
・RAM空き容量 3.85GB
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/12 10:29
2020/04/12 10:30
2020/04/12 13:46
2020/04/12 14:15
2020/04/13 16:11