相同的光线跟踪器代码返回不同的结果(cmake)

时间:2015-08-31 13:07:12

标签: c++ ubuntu cmake

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

再次尝试克隆所有内容,通过usb复制文件并更新编译器。

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

我希望,有人可以帮助我!

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

1 个答案:

答案 0 :(得分:1)

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

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