使用real * 4读取值为0的real * 8变量会在fortran中导致大量警告而没有警告

时间:2019-06-18 01:27:32

标签: fortran

使用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

1 个答案:

答案 0 :(得分:3)

这不是编译器的问题。这是代码的问题。您的代码确实向我发出警告,表明您在做某事,这应该是邪恶的。认为dsecs的子例程长4个字节,发送了4个字节。认为dsecs长8字节的子例程看了8个字节。其他4个字节又是多少?谁知道。两者混合在一起时看起来如何?可能不是您想要的。就像不小心将一小撮冰淇淋和一半垃圾送达了一个小勺子:不太可能尝到您的想法。

这是一个经典笑话可以很简单地解决的问题之一:“医生,医生,当我这样做时会很痛!” -“那就...别那样。”

编辑:对不起,我被骗了。我没有将它们作为单独的程序进行编译。当我这样做时,我不会收到警告。这也是正常现象-在编译步骤中,您没有指定外部子例程的外观,因此不会抱怨,在链接步骤中,编译器不再进行检查。