2012-04-16 164 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()函数,该函数执行边界检查以捕获第一个无效访问。