0

重複の可能性:
Cでの最大配列サイズ

私の質問は次のとおりです。Code::blocksにはループの最大反復回数がありますか?

私はモンテカルロを実行していますが、forループを介して100万個のパーティクルを実行したいと思います。しかし、クラッシュせずに行くように見える最大値は110000です。

ありがとう!

いくつかの詳細:

時間によってシードされた乱数ジェネレーターを使用しています:

    srand(time(NULL));

次に、100万個のパーティクルを作成します(ランダム)

    for(k=0; k<M; k++){
    R[k] = rand()*(1)/(double)RAND_MAX;
    z[k] = -log(1 - R[k])/(1000*U);

ここで、M = Num / 10(N 1000000を#defineしたい)

これは私が考えることができる唯一のことであり、問​​題を引き起こしていますか?

これは機能しないサンプルコードです。

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

    int main(){

      srand(time(NULL));

       int j=0;
       int i;
       double A[1000000];

       for(i=0;i<1000000;i++){
          A[i] = rand()*(1.0)/(double)RAND_MAX;
           if (A[i] == 1.0){
              printf("Wow!\n");
           }
       }

       return 0;

    }

これは、Code ::blocksの設定が原因である可能性がありますか?

4

2 に答える 2

2

反復の最大回数はありませんが、スタック サイズには制限があります。

ローカル変数を宣言すると、メモリはスタックから割り当てられます。のサイズAが大きすぎてスタックに収まりません。(たとえば、Windows の典型的なスタック サイズは 1MB で、1000000 * sizeof(double)それよりはるかに大きいです。)

Aグローバル変数に変更するか、 で割り当てることができmallocます。

于 2012-11-22T18:16:22.213 に答える
1

編集: これは、デフォルトの最大スタック サイズが Windows では 1MB (Linux では 8MB) であるためです。

最終的な答えはありませんが、次のことは知っています。

a) Linux コマンドラインから正常に実行されます。

b) Valgrind は、次の形式のエラーを大量に返します。

==2465== Invalid write of size 8
==2465==    at 0x804851D: main (test2.c:16)
==2465==  Address 0xbe4480e4 is on thread 1's stack
==2465== 
==2465== Invalid write of size 4
==2465==    at 0x8048521: main (test2.c:16)
==2465==  Address 0xbe4480e0 is on thread 1's stack
==2465== 
==2465== Invalid read of size 4
==2465==    at 0x4081D69: printf (printf.c:35)
==2465==    by 0x8048528: main (test2.c:16)
==2465==  Address 0xbe4480e0 is on thread 1's stack
==2465== 
==2465== Invalid read of size 8
==2465==    at 0x407AC05: vfprintf (vfprintf.c:1622)
==2465==    by 0x4081D7F: printf (printf.c:35)
==2465==    by 0x8048528: main (test2.c:16)
==2465==  Address 0xbe4480e4 is on thread 1's stack

c) エラーは明らかにアレイからの読み取りと書き込みに関連しています。この単純なバージョンのプログラムでは、Valgrind エラーは発生しません。

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

int main(){
  srand(time(NULL));
  int i;
  for(i=0;i<1000000;i++){
     if (rand()*(1.0)/(double)RAND_MAX == 1.0){
         printf("Wow!\n");
     }
  }
  return 0;
}
于 2012-11-22T17:52:06.723 に答える