こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

プログラミングについて

以下のプログラムをコンパイル、実行しようとするとコアダンプと表示されてしまいます。
おそらく配列がうまくいっていないというのは察したのですが、どううまくいっていないのかがわかりません。
原因を教えていただきたいです。
このプログラムは、Nを入力し、0~100までの乱数をN個表示させるものです。
配列を使っているのは、このプログラムが完成したのち、改良してその乱数同士を計算するプログラムにしたいためで、その途中段階でした。

環境は、Cygwinです。
―――以下ソースコード―――

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main(void){

int i,N;
double u[N];
int ransu;


printf("Define N : \n"); //得たい乱数の数を設定
scanf("%d",&N);

for(i = 0; i < N; i++)
{
ransu = rand() % 101 ; //0~100までの乱数を得る
u[i] = (double) ransu;
printf("%.0f ", u[i]);
}

printf(" \n");

return 0;

}

教えていただける方、いらっしゃいましたら教えていただきたいです。よろしくお願いします。

投稿日時 - 2015-11-27 12:25:58

QNo.9086908

すぐに回答ほしいです

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

>int i,N;
>double u[N];

この段階で「Nは不定(たぶん、0になっている)」ので、配列の要素数も「不定(たぶん0個)」です。

「Nの値を入力し終わってから、配列を動的に確保する」か「配列の要素数を固定で取っておいて、配列の要素数を超えるNが入力されたら、入力エラーにする」ようにしましょう。

・動的に確保する場合
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main(void){

int i,N;
double *u;
int ransu;

printf("Define N : \n"); //得たい乱数の数を設定
scanf("%d",&N);

u = (double *)malloc(sizeof(double)*N);
if (!u)
{
printf("Out of memory.\n");
return 1;
}

for(i = 0; i < N; i++)
{
ransu = rand() % 101 ; //0~100までの乱数を得る
u[i] = (double) ransu;
printf("%.0f ", u[i]);
}

printf(" \n");

free(u);

return 0;

}

・要素数を固定(最大200個)にする場合
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main(void){

int i,N;
double u[200];
int ransu;

printf("Define N : \n"); //得たい乱数の数を設定
scanf("%d",&N);

if ((N < 0) || (N > 200))
{
printf("Illigal number.\n");
return 1;
}

for(i = 0; i < N; i++)
{
ransu = rand() % 101 ; //0~100までの乱数を得る
u[i] = (double) ransu;
printf("%.0f ", u[i]);
}

printf(" \n");

return 0;

}

あと、蛇足だけど「N」みたいな「大文字だけの変数名」や「1文字だけの変数名」は、なるべく使わない方が良い。
(「i」「j」「k」は「歴史的な慣習」なので、使っても良いが、出来るだけ使用は避けるべき)

投稿日時 - 2015-11-27 12:50:00

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

配列を使う意味がわからない

サンプルソースで行きたいなら

そのままだと配列数が未定義なので

scanf("%d",&N);の後に

double u[N];を宣言しましょう

投稿日時 - 2015-11-27 15:39:12

ANo.3

因みに、配列をmallocで動的に確保する場合、Nに負数を入れられるとmallocがエラーになりNULLを返し、次のエラー判定でプログラムが停止するので、最初の回答では「Nが負数かどうかの判定を省略」しています。

回答No.2で書いたように「Nが負数なら、プログラムを終了する」など、きちんと判定した方が良いです。

投稿日時 - 2015-11-27 13:01:06

ANo.2

追記。

メモリを動的に確保するように変更しても、Nに負数を入力されたら、forループが終わらなくなり、coreダンプするので、Nに負数を入れられた時の対処を追加しましょう。

投稿日時 - 2015-11-27 12:52:52

あなたにオススメの質問