2016-08-22 120 views
-4
/********************************************************************************************* 
* Function: Appends the Node newelement to the end of the List 
*********************************************************************************************/ 
void append(const T &newelement) 
{ 
    Node *N = new Node(newelement); 

    if(first == (Node*)0) 
    { 
     first = N; 
     last = N; 
     _length = 1; 

    } 
    else 
    { 
     last->insertNodeAfter(N); 
     last = N; 
     _length++; 
    } 
}; 

/********************************************************************************************* 
* Function: Appends the Node newelement to the end of the List 
*********************************************************************************************/ 
void prepend(const T &newelement) 
{ 
    Node *N = new Node(newelement); 

    if(first == (Node*)1) 
    { 
     first = N; 
     last = N; 
     _length = 1; 
    } 
    else 
    { 
     first->insertNodeBefore(N); 
     first = N; 
     _length++; 
    } 
}; 

,因爲人們都告訴我了,我已經將範圍縮小到該代碼排序...它打破時,其嘗試添加一個節點列表。給我訪問錯誤等。 (但只有有時)C++程序將無法在Mac上正常運行,但會在Windows

+3

[TL;DR¡](https://en.wikipedia.org/wiki/TL;DR)請嘗試通過調試到碼縮小到只有問題的部件,例如。請學習如何創建[最小化,完整和可驗證的示例](http://stackoverflow.com/help/mcve),以及[請閱讀如何提出好問題](http://stackoverflow.com/help /如何對問)。 –

+5

解決此類問題的正確工具是您的調試器。在*堆棧溢出問題之前,您應該逐行執行您的代碼。如需更多幫助,請閱讀[如何調試小程序(由Eric Lippert撰寫)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您應該\編輯您的問題,以包含一個[最小,完整和可驗證](http://stackoverflow.com/help/mcve)示例,該示例再現了您的問題,以及您在調試器。 –

+0

我不知道錯誤在哪裏,代碼在Windows上運行得非常好,但在Mac上無法運行。我試圖將其縮小到某種程度,但是我一直無法做到,因爲每次在Mac上運行它時都會在不同階段中斷。 – MichaelMariani

回答

1

乍一看,例如first == (Node*)1(在prepend)是非法/未定義,並會給隨機行爲。根據芯片和操作系統的內存佈局,這將會存活,有時候工作,總是工作,隨機失敗或者總是失敗。 Mac和x86芯片的行爲有所不同,這並不奇怪。

有代碼其他多種假設,像一個int是東西足夠大;等

所有這些規則,人們傾向於粉飾有一個原因,而許多這樣的錯誤你得逞的一個架構,但不是在另一個。

+0

你會建議,而不是第一==(節點*)1這不是什麼打破它有時。有時它的追加。 – MichaelMariani

+0

我懷疑'(Node *)1'是'(Node *)0'的拼寫錯誤。正確的使用是'nullptr',它不需要被轉換。 – Barmar

+1

@MichaelMariani當你有未定義的行爲時,它不一定會死在導致問題的相同代碼中。未定義的行爲通常會以一種直到很晚纔得到注意的方式來破壞內存。 – Barmar

1

之前錯誤地刪除你的代碼問題的相關部分,該錯誤是相當明顯的。

DoubleLinkedNode的構造函數未能初始化nextNodepreviousNode類成員爲NULL。這導致未定義的行爲。

僅僅因爲一個C++特定線路上的程序崩潰,這並不意味着這就是錯誤的。

當您將新節點添加到列表中時,您正在崩潰。

但錯誤是insertNodeAfter()被取消引用未初始化的指針。錯誤是因爲構造函數無法將它們初始化爲NULL。

+0

這很有道理,謝謝,我沒有寫出給我們找出錯誤的代碼。我發現他們中的大多數,並得到了代碼在uni工作,但是當我回到家時,它只會在我的Mac上打破。 – MichaelMariani

相關問題