【问题标题】:Adding/removing a PRINT statement changes variables添加/删除 PRINT 语句会更改变量
【发布时间】: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


【解决方案1】:

我认为这表明代码中存在其他一些错误(例如内存损坏)。我不确定您使用了哪些调试标志。但是,请尝试编译标志“-check all”(用于 intel fortran 编译器)。此标志检查多个可能的错误。更多详情可以参考https://software.intel.com/sites/default/files/m/f/8/5/8/0/6366-ifort.txt

【讨论】:

  • “我使用 ifort 提供的多个调试标志运行我的代码。” 我认为这更像是一个评论而不是一个答案,并且不会为现有的评论带来任何新的东西.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2015-05-25
  • 1970-01-01
相关资源
最近更新 更多