我正在运行大气模型,需要编译可执行文件来转换某些文件。如果我按照提供的方式编译代码,它会运行,但它会卡住并且不会完成。它没有给出错误或类似的东西。
在通过添加print语句进行一些测试以查看它被卡住之后,我发现只有在我用其中一个子例程中的print语句编译代码时才会运行可执行文件。
有问题的代码是here。具体来说,代码无法运行,除非我在get_bottom_top_dim子例程中的某处放置了print语句。
有谁知道为什么会这样?打印声明的内容并不重要(目前我正在使用print *,'!')。但是一旦我删除它或将其注释掉,代码就不再有效了。
我认为它必须与我的机器或编译器有关(ifort 12.1.0),但我很难解决问题所在!
答案 0 :(得分:2)
这是一个扩展的评论而不是答案:
您描述的情况,插入一个显然修复程序的打印语句,通常在基础问题是由于
引起时出现a)尝试访问数组声明边界之外的元素;或
b)某些程序的虚拟和实际参数之间不匹配。
使用编译器选项重新编译程序,以便在编译时检查接口并在运行时检查数组边界。
答案 1 :(得分:0)
自从我上次使用Fortran以来,它已经发展了很多,但是这里是如何解决你的问题的。
print
副作用时,编译器将子程序优化为无操作。或者编译器错误正在将此代码转换为空或无限循环或崩溃代码。 (你究竟是什么意思"无法运行"?)或者链接器无法链接一些所需的代码,除非子例程明确调用print
。
或者这个子例程中存在一个错误,并且print语句改变了它的症状,例如:通过更改哪些数据被索引越界错误覆盖。print
语句,例如记录到文件或内存中的文本缓冲区。
或者打开所有可选的运行时内存检查和编译时警告。或者简化代码直到问题消失,然后二进制搜索带回代码直到问题再次发生。