Fortran脚本仅在添加print语句时运行

时间:2014-06-14 19:35:06

标签: fortran

我正在运行大气模型,需要编译可执行文件来转换某些文件。如果我按照提供的方式编译代码,它会运行,但它会卡住并且不会完成。它没有给出错误或类似的东西。

在通过添加print语句进行一些测试以查看它被卡住之后,我发现只有在我用其中一个子例程中的print语句编译代码时才会运行可执行文件。

有问题的代码是here。具体来说,代码无法运行,除非我在get_bottom_top_dim子例程中的某处放置了print语句。

有谁知道为什么会这样?打印声明的内容并不重要(目前我正在使用print *,'!')。但是一旦我删除它或将其注释掉,代码就不再有效了。

我认为它必须与我的机器或编译器有关(ifort 12.1.0),但我很难解决问题所在!

2 个答案:

答案 0 :(得分:2)

这是一个扩展的评论而不是答案:

您描述的情况,插入一个显然修复程序的打印语句,通常在基础问题是由于

引起时出现

a)尝试访问数组声明边界之外的元素;或

b)某些程序的虚拟和实际参数之间不匹配。

使用编译器选项重新编译程序,以便在编译时检查接口并在运行时检查数组边界。

答案 1 :(得分:0)

自从我上次使用Fortran以来,它已经发展了很多,但是这里是如何解决你的问题的。

  • 想一想可以解释症状的假设,例如:当编译器没有print副作用时,编译器将子程序优化为无操作。或者编译器错误正在将此代码转换为空或无限循环或崩溃代码。 (你究竟是什么意思"无法运行"?)或者链接器无法链接一些所需的代码,除非子例程明确调用print。 或者这个子例程中存在一个错误,并且print语句改变了它的症状,例如:通过更改哪些数据被索引越界错误覆盖。
  • 想办法测试这些假设。您可能已经有足够的观察结果来排除它们中的一些。您可以反编译目标代码以查看此子例程是否为空。或者在调试器中逐步执行它。或者使用不同的副作用替换print语句,例如记录到文件或内存中的文本缓冲区。 或者打开所有可选的运行时内存检查和编译时警告。或者简化代码直到问题消失,然后二进制搜索带回代码直到问题再次发生。
  • 首先进行最可能或最简单的测试。排除一些假设,然后迭代。