我有双重链表: http://dl.dropbox.com/u/16185759/list.h
和其他课程中的方法:
List<int> get_vertices()
{
Element<Edge*> *curr = edges->head;
List<int> vertices;
int v1, v2;
while (curr != 0)
{
v1 = curr->data->v1;
v2 = curr->data->v2;
if (vertices.has(v1) == false)
{
vertices.insert(v1);
}
if (vertices.has(v2) == false)
{
vertices.insert(v1);
}
curr = curr->next;
}
return vertices;
}
方法没有根据debug调用。
编译器忽略它,替换值false,如果你在最后删除返回false,那么一切正常。
怎么办? 提前谢谢
答案 0 :(得分:1)
如果你删除最后的return
出现,那么你就会引发未定义的行为并且编译器可以做任何想做的事情:在这种情况下,它会返回true随机的机会。
问题似乎不在此代码中,但很可能您存储的数据类型的operator==
与列表中的预期项目不完全匹配。对于浮点或用户数据类型,情况可能如此。
答案 1 :(得分:0)
如果你使用GCC,你可以运行g++ -fdump-tree-all
并获得很多(数百个)转储文件,其中包含GCC内部表示的文本表示,这样你就可以理解正在进行哪些优化
答案 2 :(得分:0)
如果您使用的是Visual C ++,那么默认情况下,调试版本不会进行优化,因此这不太可能是优化错误。
我认为更可能的结果是调试符号没有正确重新加载。您可以通过在函数中抛出一个硬错误来检查这一点,如果抛出错误,您就会知道代码是否已到达。
我建议使用printf将调试输出打印到控制台,而不是仅仅依赖断点。
那就是问你的问题:你有没有理由不使用Standard Template Library list?
另外,我有点担心编译器甚至允许你有bool返回的函数,没有定义的返回。您的编译器设置了什么警告级别? (我担心你或其他人降低了它,你错过了关键警告)