-1

C++の2つのファイルから入力を受け取るプログラムがあります。次に、2番目の入力ファイルがトポロジカルソートであるかどうかを特定します。しかし、どういうわけか、whileループステートメントでlist.empty()を使用すると、セグメンテーション違反が発生しますが、forループではエラーは発生しません。ただし、forループは1回だけループします。これは、2回通過する必要がある場合があるためです。

#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;
}
4

2 に答える 2

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

これは明らかなエラーです-nのサイズを指定するために使用していますsuccessorが、nまだ初期化されていないため、ガベージが含まれています(countサイズmarksを指定した場合nも同様です)。つまり、現時点では、のサイズについてはわかりませんsuccessor

いくつかの選択肢があります。あなたはあなたを動かすことができますidata >> n; 、、、およびを定義する前に、またはサイズなしでそれらを定義し、から読み取った後にそれらのサイズを指定するために使用することができます。successorcountmarksresizenidata

私はstd::listそれが最適な選択であるとはめったに見つけられないことを指摘することを超えて、私のいつもの怒りを省きます。

于 2012-04-16T04:02:58.277 に答える
0

読み込まれた値とは何x1ですかx2?値が、より大きい場合n、ベクトルの要素へのアクセスは無効です:count[x2]marks[x1]およびsuccessor[x1]無効な要素を参照します。

下付き文字表記([])の代わりに、at()境界チェックを実行して最初の無効なアクセスをキャッチする関数を使用します。

于 2012-04-16T03:50:02.793 に答える