【问题标题】:Same raytracer code returns different results (cmake)相同的光线追踪器代码返回不同的结果(cmake)
【发布时间】:2015-08-31 13:07:12
【问题描述】:

对于我们的最后一项任务,我和一个朋友正在用 c++ 创建一个 Raytracer。我们正在与 Github 和 cmake 合作。一切正常,直到我们实现了阴影和折射。这些在我朋友的电脑上工作正常,但在我的电脑上不行。阴影根本不起作用,折射上有很多黑点。另一个奇怪的事情是,主文件中的 std::couts 在执行后不会显示在终端中,但我肯定在处理正确的文件(在其中写入随机内容时仍然会出错)。

尝试了几乎所有方法,从再次克隆、通过 USB 复制文件和更新编译器。

由于我们正在使用浮点数,我认为这可能是浮点数不准确的结果,但我想这并不能解释丢失的打印... 真的不知道,代码的哪一部分会有所帮助,但我可以发布任何内容。他在 64 位上使用 Ubuntu 15.04,而我在同一台机器上使用 14.04。

希望有人能帮帮我!

编辑:好的,只是尝试从包含的文件中打印一些东西,工作得很好。但仍然没有从主文件中打印出来..

【问题讨论】:

  • 如果您不知道要发布哪部分代码,那么您就不知道错误在哪里。这意味着你必须查明它。开始删除块(#if 0,注释掉之类的东西),每次删除后进行测试,直到问题消失。然后你会更接近发现错误。
  • 好吧,好像你有未定义的行为。尝试寻找未初始化的值、不安全的指针或一些错误的强制转换。尝试启用警告,它应该对您有所帮助。
  • 而不是cout << "output\n"; 试试cout << "ouput" << endl; endl 将刷新缓冲区,强制应用程序打印
  • 尝试在两台计算机上禁用所有优化的情况下进行编译,因此在调试模式下...一些激进的优化有时会导致此类问题。您是否还在光线跟踪代码中使用带有硬编码种子的随机数生成器?也许不同的行为(不包括 cout)将来自计算机上的随机数序列不同......
  • 为所有内容添加日志记录,并寻找第一个分歧的地方。回溯,看看为什么会有所不同。可能是不同的编译器版本(很可能)或只是“未定义的行为”和细微的差异,例如一台机器通过地址空间随机化加载数据/代码的位置。

标签: c++ ubuntu cmake


【解决方案1】:

造成这种行为差异的原因可能是:

  1. 尝试找出程序中第一次出现差异的地方。为此,您可以尝试记录一些事件,例如进入和离开函数、if 语句谓词的值,您可以在其中做出一些决定等。您还可以添加不变量检查(使用 assert 语句或类似语句)。
  2. 未定义的行为是此类问题的最可能原因。它可以是未初始化的变量、越界内存访问等。要检查这一点,请使用 -Wall -Wextra(甚至 Clang 中的 -Weverything)进行编译,使用 sanitizers,例如 -fsanitize=address,undefined(在 GCC 和 Clang 中可用) .您还可以使用 Valgrind 或一些静态分析工具来捕获此类错误。
  3. 某些库的版本不同。记录库调用的返回值,以确保第三方库的行为相同。
  4. 如果程序是多线程的,并且存在竞态条件,则程序可以表现出您描述的行为。因此,请注意线程正确性。你可以使用线程清理器来捕捉它。
  5. (不太可能,正如您自己已经得出的结论)编译器版本和优化的差异。根据应用的优化,浮点运算可能会产生略微不同的结果。尝试不同的优化级别,看看问题是否与此有关。

【讨论】:

    猜你喜欢
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多