2016-11-11 6 views
-1

Das folgende Programm verursacht anscheinend einen Segmentierungsfehler für die Schleifenvariable.Segmentierungsfehler, der auf die Schleifenvariable zugreift

Könnte mir bitte jemand helfen zu verstehen, was vor sich geht!

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: Der Fehler wird um das Ende an der result.push_back (i);

+0

Geben Sie uns genügend Code, um das Problem zu reproduzieren, bitte. –

+0

Kann 'A [i2 + j * i]' außerhalb des zulässigen Bereichs liegen? – Dani

+0

@Dani ist es nicht. Der Fehler scheint in result.push_back (i) – JoyGreen

Antwort

0

Aus einem kurzen Blick, sehe ich, dass der Vektor A von Größe n ist. Aber in der ersten verschachtelten for-Schleife wird das Array A an {i2 + j*i} indiziert. Dieser Ausdruck kann zu einer Zahl größer als n als j von 0 bis n-1 ausgewertet werden. So kann {i2 + j*i} die Kapazität Ihres Vektors überschreiten, die den Seg-Fehler verursachen kann. Der vollständige Code wird uns helfen, dies zu überprüfen.

+0

Ich glaube nicht, das ist das Problem, ich kann nur bis zu sqrt (n) – JoyGreen

+0

The Problem scheint in der result.push_back (i) – JoyGreen

+0

auf den zweiten Blick. Du hast recht. A [i2 + j * i] ist das Problem. Ich aktualisierte die for-Schleife für (int j = 0; i2 + j * i JoyGreen

Verwandte Themen