相同的光线跟踪器代码返回不同的结果(cmake) 对于我们的最后一个任务,我和朋友正在C++中创建一个光线跟踪程序。我们正在与Github和cmake合作。一切正常,直到我们实现了阴影和折射。这些在我朋友的电脑上很好用,但在我的电脑上不行。阴影根本不起作用,折射在上面有很多黑点。另一件奇怪的事情是,主文件中的std::couts在执行后不会显示在终端中,但我确实在处理正确的文件,在其中写入随机内容时仍然会出错

相同的光线跟踪器代码返回不同的结果(cmake) 对于我们的最后一个任务,我和朋友正在C++中创建一个光线跟踪程序。我们正在与Github和cmake合作。一切正常,直到我们实现了阴影和折射。这些在我朋友的电脑上很好用,但在我的电脑上不行。阴影根本不起作用,折射在上面有很多黑点。另一件奇怪的事情是,主文件中的std::couts在执行后不会显示在终端中,但我确实在处理正确的文件,在其中写入随机内容时仍然会出错,c++,ubuntu,cmake,C++,Ubuntu,Cmake,尝试了几乎所有的事情,从再次克隆、通过usb复制文件到更新编译器 由于我们使用浮点运算,我认为这可能是浮点不准确的结果,但我想这不能解释丢失的打印。。。 我真的不知道,代码的哪一部分会有帮助,但我可以发布任何内容。他在64位上使用Ubuntu 15.04,我在同一台机器上使用14.04 我希望,有人能在这里帮助我 编辑:好的,只是试着从包含的文件中打印一些东西,效果很好。但是主文件仍然没有打印。这种行为差异的原因可能是: 试着在程序中找出第一次出现差异的地方。为此,您可以尝试记录一些事件,如输入

尝试了几乎所有的事情,从再次克隆、通过usb复制文件到更新编译器

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

我希望,有人能在这里帮助我


编辑:好的,只是试着从包含的文件中打印一些东西,效果很好。但是主文件仍然没有打印。

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

试着在程序中找出第一次出现差异的地方。为此,您可以尝试记录一些事件,如输入和输出函数、在其中做出某些决策的if语句谓词的值等。您还可以使用assert语句或类似语句添加不变量检查。 未定义的行为最有可能导致此类问题。它可以是未初始化的变量、超出范围的内存访问等。要检查,请使用-Wall-Wextra甚至-Weverything在Clang中编译,例如使用-fsanize=address,未定义在GCC和Clang中可用。您还可以使用Valgrind捕捉此类错误,或者使用一些静态分析工具。 某些库的版本不同。记录库调用的返回值,以确保第三方库的行为相同。 如果程序是多线程的,并且存在争用条件,则程序可以显示您描述的行为。因此,请注意线程的正确性。你可以使用线程消毒剂来捕捉它。 不太可能,因为您已经总结了自己在编译器版本和优化方面的差异。根据所应用的优化,浮点操作可能会给出略有不同的结果。尝试不同的优化级别,看看问题是否取决于此。
如果您不知道发布代码的哪一部分,那么您就不知道错误在哪里。这意味着你必须精确定位。开始删除块(如果为0),注释掉,诸如此类的事情,在每次删除后进行测试,直到问题消失。那么你就更接近于找到错误了。看来你有未定义的行为。尝试查找未初始化的值、不安全的指针或一些错误的强制转换。请尝试启用警告,这会对您有所帮助。与其在两台计算机上都禁用所有优化的情况下尝试编译,不如在调试模式下。。。某些激进的优化有时会导致此类问题。另外,在光线跟踪代码中是否使用随机数生成器和已编码种子?也许排除cout的不同行为来自于计算机上不同的随机数序列……为所有内容添加日志记录,并寻找其发散的第一个地方。追溯一下,看看它为什么不同。很可能是不同的编译器版本,也可能只是未定义的行为和细微的差异,例如一台机器加载数据/代码时地址空间的随机性。