1

このセグメンテーション違反の原因を特定できないため、宿題を完了することができませんでした。

ファイルからリンクリストにノードを追加しようとしています。複数のテストを実行して問題をかなり絞り込みましたが、実際に何が問題を引き起こしているのかわからないため、他の詳細を変更しようとすると新しい問題が発生します。

これは私の2番目のコースなので、うまくいけば、私のコードはそれほど悪くなく、仕方がありません。addメソッドは次のとおりです。

    bool OrderedList::add (CustomerNode* newEntry)
{
if (newEntry != 0)
{
    CustomerNode * current;
    CustomerNode * previous = NULL;
    if(!head)
        head = newEntry;
    current = head;
  // initialize "current" & "previous" pointers for list traversal
   while(current && *newEntry < *current) // location not yet found (use short-circuit evaluation)
   {
    // move on to next location to check
    previous = current;
    current = current->getNext();
   }

  // insert node at found location (2 cases: at head or not at head)
  //if previous did not acquire a value, then the newEntry was
  //superior to the first in the list. 
  if(previous = NULL)
    head = newEntry;
  else
  {
    previous->setNext(newEntry); //Previous now needs to point to the newEntry
    newEntry->setNext(current); //and the newEntry points to the value stored in current.
  }
}
    return newEntry != 0;  // success or failure
    }

さて、プログラムに含まれているオーバーロードされた演算子<があります。外部テストは演算子の問題を示していませんが、私もそれを含めます:

    bool CustomerNode::operator< (const CustomerNode& op2) const
    {
       bool result = true;
       //Variable to carry & return result
       //Initialize to true, and then:
       if (strcmp(op2.lastName, lastName))
        result = false;

        return result;
       }

そして、これがgdbからのバックトレースです。

    #0  0x00401647 in CustomerNode::setNext(CustomerNode*) ()
    #1  0x00401860 in OrderedList::add(CustomerNode*) ()
    #2  0x004012b9 in _fu3___ZSt4cout ()
    #3  0x61007535 in _cygwin_exit_return () from /usr/bin/cygwin1.dll
    #4  0x00000001 in ?? ()
    #5  0x800280e8 in ?? ()
    #6  0x00000000 in ?? ()

これは、別のセグメンテーション違反を修正しようとする多くの作業の結果であり、これははるかに驚くべきことでした。setNextメソッドがどのように問題を引き起こしているのかわかりません。次のとおりです。

void CustomerNode::setNext (CustomerNode* newNext)
{
    //set next to newNext being passed
    next = newNext;
    return;
}

よろしくお願いいたします。この問題を特定する必要がある場合は、さらに多くのコードを投稿させていただきます。

4

3 に答える 3

4

これは

if(previous = NULL)

それ以外の

if(previous == NULL)

これは次のように設定previousされ、ブランチNULLに入ります。else

previous->setNext(newEntry); //Previous now needs to point to the newEntry
newEntry->setNext(current);

未定義の動作が発生します。

于 2012-10-02T08:50:55.180 に答える
1
if(previous = NULL)

常に評価されるため、少し疑わしいようfalseです。

この種のエラーは、主に次の 2 つの方法で回避できます。

  • を惜しみなくconst振りかけ、できる限りどこにでも振りかけます。

  • 値と比較するときは、その値を左側に置きます。

例えば、書く

if( NULL = previous )

クラッシュや不正確な結果ではなく、コンパイル エラーが発生します。

個人的には、この問題を経験したことがないので、左側の値は使用しません。私はかなり寛大なので、一部は疑っていconstます。でも初心者なので、これでいいと思います。

于 2012-10-02T08:51:14.110 に答える
0

すべてのコードを投稿することもできますが、最初に目にする明らかな問題は次のとおりです。

if(previous = NULL)

C/C++/Java で == を意味するときに = を使用するのは非常によくある間違いです。

于 2012-10-02T08:52:41.960 に答える