Fortran 程序的输出取决于任意打印语句?
我有一个Fortran 95代码,它的输出似乎是一个函数,它不应该是一个函数。具体而言,以下场景正在发生:Fortran 程序的输出取决于任意打印语句?,fortran,gfortran,Fortran,Gfortran,我有一个Fortran 95代码,它的输出似乎是一个函数,它不应该是一个函数。具体而言,以下场景正在发生: 运行版本为A的代码;它不起作用(我的意思是,它在编译和运行时起作用,但它没有给出我期望的结果) 运行版本为B的代码;它起作用了。版本B只包含对版本A的微小修改,如打印语句或变量数值的微小更改 运行版本为A的代码;突然,它起作用了 我认为在初始化变量之前,内存或使用变量存在一些问题,因此我想知道是否有办法使用gfortran检查这类问题,或者是否有人知道问题可能是什么。我试过gfortr
- 运行版本为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
进行编译,进一步探讨初始化的想法。如果变量在被显式初始化之前就被使用,那么这个想法就是强制代码失败。当然,如果您的代码通常依赖于隐式初始化,那么这可能会产生大量不相关的异常。