【问题标题】:Fortran runtime error "fixed" by writing output通过写入输出“修复”了 Fortran 运行时错误
【发布时间】:2009-08-25 23:42:21
【问题描述】:

我在使用一些用于研究的旧代码时遇到问题,我想使用英特尔 Fortran 编译器进行编译。在一个特定的子程序中,除非我添加一个只输出循环索引值的write 语句,否则我会遇到分段错误。

do j=1,ne

SOME STUFF

write(*,*) 'j=', j

end

是什么导致了我的错误,以至于这个写语句可以修复我的分段错误? (注:j 声明为整数)

谢谢, 凯利

【问题讨论】:

  • 你能把它分解成一个最小的、独立的、仍然崩溃的例子吗?否则很难诊断;在“某些东西”中的某处可能存在未定义的行为,因此段错误被写入的某些副作用所阻止。基本上你的经典“heisenbug”....
  • 我遇到了完全相同的问题。我可以看到这可能是由于编译中使用了不同的优化。这让我认为代码仍然存在问题,即使它不再崩溃。

标签: fortran


【解决方案1】:

导致此类错误的经典方法是通过插入写入语句“修复”:

  1. 离开数组的末尾——使用编译器打开边界检查和调试选项来检查这一点;

  2. 提供给子程序的参数与预期的参数不一致。同样,如果可能,请使用您的编译器,否则请使用您的眼睛。

其中之一是原因的可能性是 5 比 1。

【讨论】:

  • 到底为什么插入一个写语句会修复这些运行时错误?
  • 它没有,它“修复”它们。引号很重要,在这里用来表示“解决方案”是虚幻的。错误的真正原因很可能是所涵盖的两个问题之一。
  • 我感觉到了,但是问题仍然是在这种情况下写语句可以改变运行时行为(除了写入单元)。
猜你喜欢
  • 2018-05-28
  • 2017-03-21
  • 2013-12-09
  • 1970-01-01
  • 2019-08-23
  • 2016-12-30
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多