質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

Q&A

解決済

3回答

2478閲覧

「c=r%scl;」で「a.exeは動作を停止しました」が発生します。

Ruqueto

総合スコア6

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

0グッド

0クリップ

投稿2020/04/12 09:28

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

C

1 int scl,r,tt,id[0];

idの添字が0です。
これはビルド通るんでしょうか…
id[1]まで使用しているので、添字は2にする必要がありますね。

C

1 char s[2][30]; 2 strcpy(s[0], "strcpy(s[1],coordinate:); is finished.");

29文字以上あるためs[0][30]以降にも書き込んでいます。

投稿2020/04/12 10:17

編集2020/04/12 10:29
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ruqueto

2020/04/12 10:29

ありがとうございます! 基本の「き」の間違いでした! 早速、コードを訂正・コンパイルし、エラーは発生しませんでした。 お手数おかけし申し訳ございませんでした。 ご指摘の件、何故かビルドできていました。 MinGW-w64が、そこまでチェックしない仕様なのかも知れません。 本当にありがとうございました。
SHOMI

2020/04/12 10:30

char s[2][30];のサイズが足りていない件も追記しましたのでご確認ください。
Ruqueto

2020/04/12 13:46

更に、ご確認頂きありがとうございます! 先程の訂正後の実行結果を見てみると、s[0][]からオーバーフローした文字列がs[1][]にある事に気付きました。 配列におけるオーバーフローの挙動の学習にも繋がりました。 ありがとうございます。
Ruqueto

2020/04/13 16:11

詳細に調べて頂き、期待以上の素晴らしい回答をありがとうございます。
guest

0

int id[0];で宣言しているので、サイズゼロのためidは使うことが出来ませんが、
id[0]id[1]に代入してしまっています。

id[2]と宣言しないといけません。

投稿2020/04/12 10:30

otn

総合スコア84618

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ruqueto

2020/04/12 13:47

ご確認ありがとうございました。
guest

0

scanf("%d%*c",&scl);

このフォーマット文字列が間違ってます。
このためにスタック領域が破壊されて暴走します

投稿2020/04/12 09:31

y_waiwai

総合スコア87782

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ruqueto

2020/04/12 09:48

早速のご回答ありがとうございます。 フォーマット文字列について、 `int型`=10進整数なので`%d`、 `\n`の回避のため代入禁止の`*`と1文字の`c`を合わせて`%*c` になるかと思います。 10進整数のところ、`long型`(`%ld`又は`%D`)にするべきでしょうか? もう少し詳しくお教え頂けますか? お手数おかけし申し訳ございません。 よろしくお願い申し上げます。
SHOMI

2020/04/12 10:22

"%*c"は読み取り結果を格納しないので特に問題ないと思いますが…
Ruqueto

2020/04/12 13:49

SHOMIさん、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問