2016-08-22 34 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

相关问题