1

機能はこれです:なぜこの関数はsegfaultですか?

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であるように、私のヘッダーで宣言されています。

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

C4およびc5はすでに適切な型のオブジェクトへのポインタとして宣言されています。

ご協力いただければ幸いです。

EDIT:以下のコードは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; 
} 

EDIT: は、多くのcoutの文に基づいて、エラーは、この機能であるように思わ:

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

EDIT:配列インデックスは変更されましたが、まだセグメンテーションがありません

+0

もっと文脈が必要です。完全でコンパイル可能な例が素晴らしいでしょう。 –

+0

まだaddElementのコードを提供していません。エラーの可能性のある場所は、デフォルトのコンストラクタ、コピーコンストラクタ、Setクラスのデストラクタでもあります。 – wolfgang

答えて

6
carr[1]=c4; 
carr[2]=c5; 

それは

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

アドバイス:gdbなどのデバッガでこれをロードすると、犯人行が特定され、非常に迅速にエラーが発生していたはずです。

+2

私は完全かつ完全なばかだ。ありがとうございます –

+1

@ロス私たちはすべて愚かな間違いをします:) – marcog

+0

実際には、残念ながらまだsegfaults –

7

アレイでは0から始まるインデックスが使用されるため、2倍の配列内の何にでもcarr[2]を設定すると、未定義の動作になります。あなたはsegfaultだったことに感謝しなければならない。 :-)

試してみてください。セグメンテーション違反の世話をする必要があります

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

+0

+1私は遅すぎました。 –

+0

まだセグメンテーションがありません。しかし、ええ、愚かな間違い –

+0

より多くのコンテキストが必要です。問題のクラスの定義を入力してください... –

関連する問題