2016-11-11 9 views
-1

Следующая программа, по-видимому, вызывает ошибку сегментации в переменной цикла.Переменная цикла доступа к разрыву сегментации

Может ли кто-нибудь помочь мне понять, что происходит, пожалуйста!

std::vector<int> Euler::Utils::sieve(int n) { 
std::vector<bool> A(n, true); 
using size_t = std::vector<bool>::size_type ; 
size_t size = static_cast<size_t>(std::sqrt(n)); 
std::vector<int> result; 

for (size_t i = 2; i < size; i++) { 
    if (A[i]) { 
     size_t i2 = static_cast<size_t>(std::pow(i, 2)); 
     for (int j = 0; j < n; j++) { 
      A[i2 + j* i] = false; 
     } 
    } 
} 
for (size_t i = 2; i < A.size(); i++) { 
    if (A[i]) { 
     //Seg fault here. 
     std::cout << i << std::endl; 
     result.push_back(i); 
    } 
} 

return result; 

}

Edit: ошибка вокруг конца на result.push_back (I);

+0

Дайте нам достаточно кода, чтобы воспроизвести проблему, пожалуйста. –

+0

Может ли 'A [i2 + j * i]' выйти за пределы диапазона? – Dani

+0

@ Дани это не. Ошибка, похоже, происходит в result.push_back (i) – JoyGreen

ответ

0

С быстрым взглядом я вижу, что вектор A имеет размер n. Но в первом вложенном цикле массив A индексируется на {i2 + j*i}. Это выражение может быть оценено до числа, превышающего n, поскольку j работает от 0 до n-1. Таким образом, {i2 + j*i} может превышать емкость вашего вектора, который может вызывать ошибку seg. Полный код поможет нам в этом.

+0

Я не думаю, что это проблема, я могу подойти только до sqrt (n) – JoyGreen

+0

проблема, кажется, в result.push_back (i) – JoyGreen

+0

На втором взгляде. Ты прав. A [i2 + j * i] - проблема. Я обновил цикл for для for (int j = 0; i2 + j * i JoyGreen