1

関数は次のとおりです。

Set::Set(Multinumber* tempArray[], int tempSize)
{
 numElements = tempSize;
 capacity = tempSize*2;
 setArray = new Multinumber*[capacity];
 for (int i=0; i<numElements; i++)
 {
  addElement(tempArray[i]);
 }
}

変数setArrayは、私のヘッダーでMultinumber**型であると宣言されています

私がこれでそれを呼ぶときはいつでもそれはsegfaultsです:

Multinumber* carr[2];
carr[0]=c4;
carr[1]=c5;
Set setb(carr,2);

c4とc5は、適切なタイプのオブジェクトへのポインタとしてすでに宣言されています。

どんな助けでも大歓迎です。

編集:以下のコードはaddElement関数です(インデントの謝罪)

const Set Set::operator+(const Set& rhs) const
{
 Set result;
 int i=0, j=0;

 while ((i < numElements) && (j < rhs.numElements))
 {
  Multinumber* toadd=new Multinumber;
  toadd=*(setArray[i]) + *(rhs.setArray[j]);
  result.addElement(toadd);
  i++;
  j++;
 }

 while ((i < numElements))
 {
  result.addElement(setArray[i]);
  i++;
 } 


 while ((j < rhs.numElements))
 {
 result.addElement(rhs.setArray[j]);
 j++;
 }


 return result;
}

編集:多数のcoutステートメントに基づいて、エラーはこの関数にあるようです:

 bool Set::isFull()
 {
  return (numElements == capacity);
 }

編集:配列インデックスを変更しましたが、それでもsegfaults

4

2 に答える 2

7

配列はゼロベースのインデックスを使用するためcarr[2]、2つの長さの配列のいずれかに設定することは未定義の動作です。セグメンテーション違反だったことに感謝する必要があります。:-)

試す:

Multinumber* carr[2];
carr[0]=c4;
carr[1]=c5;
Set setb(carr,2);

それはセグメンテーション違反の世話をする必要があります。

于 2010-12-01T15:56:16.200 に答える
6
carr[1]=c4;
carr[2]=c5;

それはすべきではありません

carr[0]=c4;
carr[1]=c5;

アドバイス:これをgdbなどのデバッガーにロードすると、原因の行が特定され、エラーがすぐに表示されます。

于 2010-12-01T15:55:57.530 に答える