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

Fortran脚本仅在添加打印语句时运行,fortran,Fortran,我正在运行一个大气模型,需要编译一个可执行文件来转换一些文件。如果我按照提供的方式编译代码,它会运行,但会被卡住,永远不会完成。它不会给出一个错误或类似的东西 在通过添加print语句进行一些测试以查看卡住的地方之后,我发现只有在其中一个子例程中使用print语句编译代码时,可执行文件才会运行 这段代码就是其中之一。具体地说,除非我在get_bottom_top_dim子例程中的某个地方放入一条print语句,否则代码将无法运行 有人知道为什么会这样吗?print语句是什么并不重要(目前我使用p

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

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

这段代码就是其中之一。具体地说,除非我在get_bottom_top_dim子例程中的某个地方放入一条print语句,否则代码将无法运行

有人知道为什么会这样吗?print语句是什么并不重要(目前我使用print*,“!”)。但一旦我删除它或注释掉它,代码就不再工作了


我假设它一定与我的机器或编译器(ifort 12.1.0)有关,但我被难住了,到底是什么问题

自从我上次使用Fortran以来,它已经有了很大的发展,但下面是如何着手解决您的问题

  • 考虑一些可以解释症状的假设,例如,编译器正在优化子例程,使其在没有
    print
    副作用的情况下不执行任何操作。或者编译器错误正在将此代码转换为空代码、无限循环或崩溃代码。(您所说的“无法运行”到底是什么意思?)或者链接器无法链接到某些需要的代码,除非子例程显式调用
    print
    。 或者,此子例程中有一个bug,print语句会改变其症状,例如,通过改变被索引越界bug覆盖的数据
  • 想办法检验这些假设。你可能已经有足够的观察结果来排除其中一些。您可以反编译目标代码以查看此子例程是否为空。或者在调试器中单步执行。或者将
    print
    语句替换为其他副作用,如记录到文件或内存中的文本缓冲区。 或者启用所有可选的运行时内存检查和编译时警告。或者简化代码直到问题消失,然后在返回代码时进行二进制搜索直到问题再次出现
  • 首先做最可能或最简单的测试。排除一些假设,然后迭代

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

      您所描述的情况,即插入一个显然修复了程序的print语句,通常是由于以下两种原因导致的潜在问题

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

      b) 某些过程的伪参数和实际参数不匹配


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

      您好,您能否详细说明放置print语句如何停止运行时错误,例如访问声明边界之外的数组元素?fortran编译器是特定的吗?谢谢。对超出其边界的数组的未经检查的访问不是由标准指定的,因此程序可以做任何它想做的事情。从物理上讲,这可能意味着破坏内存,这可能会改变局部变量的值或中断调用堆栈,但这只是开始。特别地,编译器不能保证在这些情况下正确编译程序。请将此视为注释。您是否尝试过使用fortran调试器(在您的计算机上)进行调试,以确定程序在没有print语句的情况下失败的位置,以及为什么在放入print语句时它会继续执行?这是一段非常大的代码,主程序缺失。使用
      -check-warn-g-traceback
      编译它,然后再次尝试运行它。