【发布时间】:2015-01-13 10:33:15
【问题描述】:
我有一些编写 fortran 代码的经验,但我从未见过这样的事情。
我正在使用大型 HPC 代码(约 10K 行)来修改子例程。我使用打印语句来验证一切是否正确完成,并在必要时进行调试。当我使用我使用的最后一个 PRINT 语句运行我的代码时,代码到处都给了我实数。一旦我评论了最后一个PRINT 语句,代码给我NaN 是我的一些变量。由于我的代码太大,这里显然不能发,不过还是发PRINT声明吧:
PRINT*, "outletBC up1 ", SUM(ABS(up(nptsx,:,:)))
up 是一些速度数组。
问题:
这怎么可能? PRINT 语句如何影响任何变量?
【问题讨论】:
-
这表明代码中的其他地方存在错误,可能与越界访问数组有关。尝试打开边界检查
-
就像@agentp 说的那样。还要检查过程调用是否正确匹配虚拟和实际参数。
-
@HighPerformanceMark 我使用 ifort 可用的多个调试标志运行我的代码。我修复了所有错误(有些错误超出了数组访问范围),但错误仍然存在。我将继续调试代码,但老实说,我更感兴趣的是了解 print 语句如何对代码中的其他任何内容产生任何影响。
-
agentp 和 Mark 说了什么。还要检查未初始化的变量。我以前也有过这种情况。如果代码中的其他地方有问题,打印语句可能会在内存中推送内容,从而导致意外行为。另见en.wikipedia.org/wiki/Heisenbug
-
c++ 上关于 inifinte loop heisenbug 的类似帖子
标签: fortran