Code:: блокирует максимальное количество итераций

Возможный дубликат:
максимальный размер массива в 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 случайно?


person Shinobii    schedule 22.11.2012    source источник
comment
Максимального количества итераций не существует. Вы должны предоставить нам сообщение об ошибке, а также соответствующий код.   -  person Lalaland    schedule 22.11.2012
comment
К сожалению, я не получаю ошибку. Я просто получаю всплывающее окно с сообщением, что Code::blocks перестал работать.   -  person Shinobii    schedule 22.11.2012
comment
Может быть проблема с аргументом журнала, равным 0. Вы должны попробовать Valgrind, чтобы быть абсолютно уверенным.   -  person 1''    schedule 22.11.2012
comment
127219 Максимальное число, которое я могу пройти до сбоя.   -  person Shinobii    schedule 22.11.2012
comment
Да, вы правы насчет журнала. Но я все еще не могу выйти за пределы 127219...   -  person Shinobii    schedule 22.11.2012
comment
Может быть, это просто потому, что у вас в стеке 8-мегабайтный массив. Попробуйте заменить double A[1000000]; на std::vector<double> A;, а A[i] = rand... на A.push_back(rand...);.   -  person Useless    schedule 22.11.2012


Ответы (2)


Изменить: это связано с тем, что максимальный размер стека по умолчанию составляет 1 МБ в Windows (но 8 МБ в Linux).

У меня нет окончательного ответа, но я знаю:

а) Он отлично работает из командной строки Linux.

б) 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

в) Ошибки явно связаны с чтением и записью из массива. Эта более простая версия программы не вызывает ошибок 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;
}
person 1''    schedule 22.11.2012
comment
Вы совершенно правы. Я не знаю, почему я даже использую массив для случайных чисел, поэтому я выкину этот массив. Огромное спасибо! - person Shinobii; 22.11.2012

Максимального количества итераций нет, но есть ограничение на размер стека.

Когда вы объявляете локальную переменную, память выделяется из стека. Размер A слишком велик, чтобы поместиться в стек. (например, типичный размер стека в Windows составляет 1 МБ, 1000000 * sizeof(double) намного больше.)

Вы можете попробовать изменить A на глобальную переменную или выделить ее по malloc.

person timothyqiu    schedule 22.11.2012