此FORTRAN代码不应编译。这有什么原因吗?

时间:2014-12-05 17:42:49

标签: compilation fortran fortran90 gfortran

以下代码编译,但我不认为它应该。如您所见,输出是垃圾。

这是一个在我工作的大型项目中让我很难的事情的最小失败例子。

我的问题是 - 为什么编译器不抱怨?这是编译器的限制,还是以某种方式"预期的行为",我错过了什么?

我正在使用gfortran 4.6.3。

module dataModule
    integer :: datum1 = int(1)
    integer :: datum2 = int(2)    
end module dataModule

program moduleTest
    use dataModule, only: datum1

    write(*,*) "datum 1 is", datum1
    write(*,*) "datum 2 is", datum2

end program moduleTest

示例输出:

datum 1 is           1
datum 2 is  4.58322689E-41

1 个答案:

答案 0 :(得分:3)

您的代码有问题,而不是编译器。 如果 datum2使用关联,尽管only子句和 if datum2的显式初始化被忽略,那么是的,那就是是一个顽皮的编译器。

但答案更为平凡。

datum2没有使用关联:在没有implicit none的情况下,它是主程序中的隐式类型变量。 "垃圾"来自以下事实:在引用其值之前未通过初始化或赋值定义它并且它是隐式(默认)实际的。编译器(或运行)时不需要编译器来检测这个错误。