使用real * 8读取值为0的real * 4变量会导致产生大量数值,有时会发出警告。
我不擅长Fortran。我只是运行从别人那里得到的Fortran代码,这造成了段错误。在调试它时,我发现其中一个子例程正在读取一个值,该变量的值由real * 8定义,因为real * 4的结果很大。
我试图用简单的代码重现它,但是编译器显示了参数不匹配的警告。我必须嵌套代码才能用简单的代码重现抑制的警告,但是我不确定抑制的警告的确切条件是什么。
实际上,出于某种原因,我怀疑这可能是我的编译器出现的问题,因为代码(不是示例代码,原始代码)在给我代码的人的PC上运行正常。
文件hello.f
:
implicit none
call sdo()
END
文件test.f
:
subroutine sdo()
implicit none
real*4 dsecs
dsecs=0
write(0,*) dsecs
call sd(dsecs)
return
end
文件test2.f
:
subroutine sd(dsecs)
implicit none
real*8 dsecs
write(0,*) dsecs
return
end
编译和执行:
$ gfortran -o hello hello.f test.f test2.f
$ ./hello
预期结果:
0. 00000000
0. 0000000000000000
实际结果:
0. 00000000
-5.2153889789423361E+223
答案 0 :(得分:3)
这不是编译器的问题。这是代码的问题。您的代码确实向我发出警告,表明您在做某事,这应该是邪恶的。认为dsecs
的子例程长4个字节,发送了4个字节。认为dsecs
长8字节的子例程看了8个字节。其他4个字节又是多少?谁知道。两者混合在一起时看起来如何?可能不是您想要的。就像不小心将一小撮冰淇淋和一半垃圾送达了一个小勺子:不太可能尝到您的想法。
这是一个经典笑话可以很简单地解决的问题之一:“医生,医生,当我这样做时会很痛!” -“那就...别那样。”
编辑:对不起,我被骗了。我没有将它们作为单独的程序进行编译。当我这样做时,我不会收到警告。这也是正常现象-在编译步骤中,您没有指定外部子例程的外观,因此不会抱怨,在链接步骤中,编译器不再进行检查。