2012-04-16 3 views
-1

나는 C++에서 2 개의 파일로부터 입력을 받는다. 그런 다음 두 번째 입력 파일이 위상 정렬인지 식별하십시오. 하지만 어떻게 든 while 루프 문에서 list.empty()를 사용하면 세그먼트 오류가 발생하지만 for 루프는 나에게 오류를주지 않습니다. 그러나 for 루프는 한 번만 반복됩니다. 이후 두 번 통과해야 할 수도 있습니다.while 루프의 분할 오류

#include <list> 
#include <iostream> 
#include <vector> 

using namespace std ; 

list<unsigned> output; 

list<unsigned> & 
testSort (istream & idata , istream & sdata) 
{ 
unsigned n,x1,x2; 
vector< list<unsigned> > successor(n); 
vector<unsigned> count(n,0); 
vector<bool> marks(n,false); 

idata >>n; 

for(int i=0;i<n;i++) { 
idata>>x1>>x2; 
count[x2]++; 
successor[x1].push_back(x2); 
if(idata.eof()) break; 
} 

for(int i=0;i<n;i++) { 
sdata>>x1; 
    if(count[x1]==0) { 
    marks[x1]=true; 

    //for(int j=0;j<successor[x1].size();++j) { 
    while(!successor[x1].empty()) { 
count[successor[x1].front()]--; 
successor[x1].pop_front();  
    } 
} 
    else { 
    for(int i=0;i<n;i++) 
    { 
    if(marks[i]==false) 
    output.push_back(i); 
    } 
    break; 
    } 

} 
    return output; 
} 
+0

세그먼트 결함이 발생할 때 가장 먼저해야 할 일은 디버거에서 프로그램을 실행하는 것입니다. 이렇게하면 크래시의 정확한 위치를 정확하게 파악하는 데 도움이 될뿐만 아니라 변수를 검사하여 원인을 파악할 수 있습니다. –

답변

2
unsigned n,x1,x2; 
vector< list<unsigned> > successor(n); 

이것은 명백한 오류입니다 - 당신이 successor의 크기를 지정 n를 사용하고 있지만 n가 아직 초기화되지 않은, 그래서 쓰레기를 포함 (및 동일 countmarks 이후로 참 크기를 n으로 지정했습니다.) 즉,이 시점에서 우리는 successor 크기에 대한 단서가 없습니다.

몇 가지 선택 사항이 있습니다. 이동할 수 있습니다 idata >> n; 당신이 idata에서 n을 읽은 후 자신의 크기를 지정할 수 resize를 사용하여 다음 전에 successor, countmarks을 정의하거나 크기 않고 그들을 정의 할 수 있습니다합니다.

내가 보통 최적의 선택이라고 생각하는 것을 지적하는 것을 넘어서 나는 평소 호언 장담을 떠날 것이다. std::list.

0

x1x2로 읽어 값은 무엇인가? 값이 n보다 큰 경우 벡터 요소에 대한 액세스가 유효하지 않습니다. count[x2], marks[x1]successor[x1]은 잘못된 요소를 나타냅니다.

첨자 표시 ([]) 대신 at() 함수를 사용하십시오.이 함수는 첫 번째 잘못된 액세스를 catch하는 경계 검사를 수행합니다.