2015-03-06 3 views
0

Я пытаюсь сделать функцию решета для нахождения простых чисел. Сама решетка состоит из массива, размер которого зависит от входного значения функции. Все хорошо для небольших чисел (< ~ 1000000), но большие значения ввода заставляют программу давать ошибку «плохого доступа» при попытке изменить значение элемента 0 массива (помечено в блоке кода).«EXC_BAD_ACCESS» При использовании массива C++

void psieve(uint64_t p) 
{ 
    bool flags[p]; 
    flags[0]=false;  //This is the line throwing the error (according to xcode) 
    flags[1]=false; 
    for (uint64_t i=2; i<p; i++) { 
     flags[i]=true; 
    } 
    for (uint64_t i=0; i<(uint64_t)sqrtl(p); i++) { 
     if (flags[i]) { 
      for (uint64_t j=i*i; j<p; j+=i) { 
       flags[j]=false; 
      } 
     } 
    } 
    for (uint64_t i=0; i<p; i++) { 
     if (flags[i]) { 
      cout<<i<<"\n"; 
     } 
    } 
} 

Специфическая ошибка броска является «EXC_BAD_ACCESS (код = 1, адрес = 0x [Это другое шестнадцатеричное число каждый раз, когда])»

Любая помощь будет высоко оценили.

+3

Почему вы не используете что-то вроде 'std :: vector'? Выделение множества вещей в стеке, вероятно, плохой план. – tadman

+0

Не говоря уже о VLA, это не C++-функция. –

ответ

1

Похоже, что ваша система имеет нисходящий растущий стек. Когда p слишком велико, запись в его нижние индексы вызывает переполнение стека. Выделите p другим способом - например, std::vector. Массивы переменной длины - это не C++-функция в любом случае - ваш компилятор просто поддерживает его как расширение.

+0

Я не думал, что вы можете использовать такой вектор: мой фон в математике и науке, поэтому нечто, называемое «вектор», не помогло. Во всяком случае, это исправило это. Спасибо за помощь! – scienceprimo

Смежные вопросы