2012-04-16 167 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

當你遇到分段錯誤時,你應該做的第一件事就是在調試器中運行你的程序。這不僅可以幫助您查明崩潰的確切位置,還可以讓您檢查變量以查看可能導致崩潰的原因。 – 2012-04-16 05:41:49

回答

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

這是一個明顯的錯誤 - 你使用n指定的successor大小,但n尚未初始化,所以它包含垃圾(和相同的是真正與countmarks自您也已將其尺寸指定爲n)。換句話說,在這一點上,我們不知道successor的大小。

你有幾個選擇。你可以移動你的idata >> n; 之前定義successorcount,並marks,或者你可以定義它們沒有大小,然後用resizeidata閱讀n後指定其大小。

我離開了我平時的咆哮約std::list超越指出,我很少能找到它的最佳選擇。

0

讀入x1x2的值是什麼?如果值大於n,則訪問矢量的元素無效:count[x2],marks[x1]successor[x1]指的是無效元素。

代替下標符號([]),使用at()函數,該函數執行邊界檢查以捕獲第一個無效訪問。