以下代码编译,但我不认为它应该。如您所见,输出是垃圾。
这是一个在我工作的大型项目中让我很难的事情的最小失败例子。
我的问题是 - 为什么编译器不抱怨?这是编译器的限制,还是以某种方式"预期的行为",我错过了什么?
我正在使用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
答案 0 :(得分:3)
您的代码有问题,而不是编译器。 如果 datum2
使用关联,尽管only
子句和 if datum2
的显式初始化被忽略,那么是的,那就是是一个顽皮的编译器。
但答案更为平凡。
datum2
没有使用关联:在没有implicit none
的情况下,它是主程序中的隐式类型变量。 "垃圾"来自以下事实:在引用其值之前未通过初始化或赋值定义它并且它是隐式(默认)实际的。编译器(或运行)时不需要编译器来检测这个错误。