Code :: blocks max iterations

时间:2012-11-22 16:41:24

标签: c codeblocks montecarlo

  

可能重复:
  Max Array Size in C

我的问题是:Code :: blocks是否具有循环的最大迭代次数?

我正在运行蒙特卡洛,我想通过for循环运行一百万个粒子。但似乎没有崩溃的最大值是110000。

谢谢!

更多信息:

我正在使用按时间播种的随机数生成器:

    srand(time(NULL));

然后我要创建一百万个粒子(随机)

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

其中M = Num / 10(我想#define N 1000000)

这是我唯一能想到的就是创造问题?

这是一个不起作用的示例代码。

    #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的设置有任何机会吗?

2 个答案:

答案 0 :(得分:2)

没有最大迭代次数,但堆栈大小有限制。

声明局部变量时,将从堆栈中分配内存。 A的大小太大而无法放入堆栈中。 (例如,Windows上的典型堆栈大小为1MB,1000000 * sizeof(double)要大得多。)

您可以尝试将A更改为全局变量,或按malloc分配。

答案 1 :(得分: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;
}