Fortran 程序的输出取决于任意打印语句?

Fortran 程序的输出取决于任意打印语句?,fortran,gfortran,Fortran,Gfortran,我有一个Fortran 95代码,它的输出似乎是一个函数,它不应该是一个函数。具体而言,以下场景正在发生: 运行版本为A的代码;它不起作用(我的意思是,它在编译和运行时起作用,但它没有给出我期望的结果) 运行版本为B的代码;它起作用了。版本B只包含对版本A的微小修改,如打印语句或变量数值的微小更改 运行版本为A的代码;突然,它起作用了 我认为在初始化变量之前,内存或使用变量存在一些问题,因此我想知道是否有办法使用gfortran检查这类问题,或者是否有人知道问题可能是什么。我试过gfortr

我有一个Fortran 95代码,它的输出似乎是一个函数,它不应该是一个函数。具体而言,以下场景正在发生:

  • 运行版本为A的代码;它不起作用(我的意思是,它在编译和运行时起作用,但它没有给出我期望的结果)

  • 运行版本为B的代码;它起作用了。版本B只包含对版本A的微小修改,如打印语句或变量数值的微小更改

  • 运行版本为A的代码;突然,它起作用了


我认为在初始化变量之前,内存或使用变量存在一些问题,因此我想知道是否有办法使用
gfortran
检查这类问题,或者是否有人知道问题可能是什么。我试过
gfortran my_program.f95-Wall-Wextra
,但它只是给了我一大堆关于不合格制表符的投诉。

这是很久以前的事了,但我解决了这个问题,所以我想我还是发布它为好。老实说,我不确定这些步骤是否是修复它的方法,但它是有效的,所以它们是:

  • 将所有过程放在模块中(这也有助于组织代码),而不仅仅是“公开”

  • 通过
    real,intent(in)::foo
    声明所有变量的意图(
    in
    out
    inout
    )。这显然有助于优化和组织,但显然它也与接口有关。。。不知道那是怎么回事


  • 就这样

    我建议您尝试打开运行时数组边界检查(对于gfortran,我认为编译器标志是
    -fbounds check
    ,但它不是我经常使用的编译器,因此请参阅文档)。正如您所总结的,如果插入打印语句似乎可以修复您的程序,那么肯定是出了问题;根据我的经验,从数组末尾走出来是您报告的症状的可能原因之一。嗯,这是一个很好的观点,但是
    -fbounds check
    似乎没有任何问题。在这种情况下,请找出编译器选项,以便在编译时检查例程接口。我不知道那是什么选择。不要相信你的直觉,如果它告诉你
    -Wall
    打开了所有编译时警告,那么它可能不会打开。好吧,所以我完全重组了程序,声明了每个变量的意图,并将每个过程放在一个模块中。在站点中,编译器选项
    -Wimplicit interface
    检查是否在没有显式接口的情况下调用了一个过程,现在它不会返回任何警告。我原以为这种迂腐会解决这个问题,但显然不是。你可以通过使用
    -finit real=snan-finit integer=-999
    以及
    -g-ffpe trap=invalid,zero-fbounds check
    进行编译,进一步探讨初始化的想法。如果变量在被显式初始化之前就被使用,那么这个想法就是强制代码失败。当然,如果您的代码通常依赖于隐式初始化,那么这可能会产生大量不相关的异常。