メモリが確保できていない??

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
KJ

メモリが確保できていない??

#1

投稿記事 by KJ » 18年前

算術乱数の和を、プログラムの途中で求めているのですが、
確保するメモリを20000よりも多くするとコンパイルは出来るのですが、
実行する際にエラーになってしまいます。
2000000個のメモリを確保したいのですが、何がおかしいのでしょうか?

プログラムは↓です。

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define N 2000000

int main(void)
{
unsigned long mkrandom(unsigned long a, unsigned long c, unsigned long x0);

double p[10], t, sigpk, *x;
unsigned long a, c, x0;
int i, k;

x = (double *)malloc(sizeof(long double) * N);

if(x == NULL){
printf("mallocに失敗\n");
return -1;
}

for(i=0 ; i<N ; i++){
x=0.0;
}

x[0] = 1; a = 61; c = 49;

x0 = x[0];

for(i=2 ; i<=N ; i++){
x0 = mkrandom(a, c, x0);
x[i-2] = x0 / (double) 4294967296;
}


for(k = 1; k <= 10; k++){
p[k-1] = 0.0;
sigpk = 0.0;
for(i=1; i<=N-k ; i++){
sigpk += (double)x[i-2]*x[i-2 +k];
p[k-1] = 12.0/N*sigpk - 3;
}
}

for(k = 1; k <= 10; k++){
t = sqrt(N-2)*p[k-1]/sqrt(1 - pow(p[k-1], 2));
printf("P_%d = %f, t = %f", k, p[k-1], t);

if(t < 2.326){
printf(" --> 受容");
}
else{
printf(" --> 棄却");
}
printf("\n");
}
free(x);
return 0;
}

unsigned long mkrandom(unsigned long a, unsigned long c, unsigned long x0){
return a*x0 + c;
}

↓(一部分ですみません・・・)だけを実行すると、失敗にならなかったので、メモリは確保できると思うのですが。。
x = (double *)malloc(sizeof(long double) * N);

if(x == NULL){
printf("mallocに失敗\n");
return -1;
}

どなたかお願いします!m(__)m

box

Re:メモリが確保できていない??

#2

投稿記事 by box » 18年前

実行時のエラーの件とは無関係かもしれませんが、
気になる点がいくつかあります。

> 	unsigned long mkrandom(unsigned long a, unsigned long c, unsigned long x0);

これでもコンパイルは通りますが、プロトタイプ宣言はmain()の外に書くのが
より一般的ではないかと思います。

> 	x = (double *)malloc(sizeof(long double) * N);

double型でなくlong double型の領域が必要な理由は何ですか?

>         for(i=1; i<=N-k ; i++){
>             sigpk += (double)x[i-2]*x[i-2 +k];

iが1のとき、x[i-2]は定義した領域の範囲外になってしまいます。

>         	p[k-1] = 12.0/N*sigpk - 3;

iに関するループの中で、毎回p[k-1]を計算する必要はありますか?


ソースコードを貼り付ける際、最初と最後を
<pre>タグと</pre>タグではさんでください(不等号は半角で)。

KJ

Re:メモリが確保できていない??

#3

投稿記事 by KJ » 18年前

>これでもコンパイルは通りますが、プロトタイプ宣言はmain()の外に書くのが
より一般的ではないかと思います。

授業のテキストに書いてあったのでそのまま書いてしまいました。そうなんですね!!

>double型でなくlong double型の領域が必要な理由は何ですか?
確保されていないのではないかと思ってlong doubleを試して、そのままでした。。

>iが1のとき、x[i-2]は定義した領域の範囲外になってしまいます。
そうですね!!
そこを直したところ正常に実行されました!
ありがとうございます!

>iに関するループの中で、毎回p[k-1]を計算する必要はありますか?
そこも修正しました!
自分でやっているときは全く気にしなかったです。。ダメですね・・・

>ソースコードを貼り付ける際、最初と最後を
<pre>タグと</pre>タグではさんでください(不等号は半角で)。


注意書きを読んだのにすっかり忘れていました!すみません!
今度からは気をつけます。

ありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る