Compilation 这个FORTRAN代码应该是';我不编译。这有什么原因吗?
下面的代码可以编译,但我认为它不应该编译。如您所见,输出是垃圾 这是一个小小的失败例子,在我所从事的一个大型项目中,它让我付出了巨大的努力 我的问题是-为什么编译器不抱怨?这是编译器的限制,还是某种程度上的“预期行为”,而我错过了什么 我正在使用gfortran 4.6.3Compilation 这个FORTRAN代码应该是';我不编译。这有什么原因吗?,compilation,fortran,fortran90,gfortran,Compilation,Fortran,Fortran90,Gfortran,下面的代码可以编译,但我认为它不应该编译。如您所见,输出是垃圾 这是一个小小的失败例子,在我所从事的一个大型项目中,它让我付出了巨大的努力 我的问题是-为什么编译器不抱怨?这是编译器的限制,还是某种程度上的“预期行为”,而我错过了什么 我正在使用gfortran 4.6.3 module dataModule integer :: datum1 = int(1) integer :: datum2 = int(2) end module dataModule progr
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
你的代码出错了,而不是编译器。如果
datum2
与only
子句相关,并且如果datum2
的显式初始化被忽略,那么是的,这将是一个顽皮的编译器
不过,答案要平凡得多
datum2
没有使用关联:在缺少implicit none
的情况下,它是主程序中的隐式类型变量。“垃圾”来自这样一个事实,即在引用其值之前,它没有通过初始化或赋值来定义,并且它是隐式(默认)实数。编译器不需要在编译(或运行)时检测此错误。您错过了隐式无
。没有它,代码是非常有效的,输出是允许的。书中最古老的技巧:)啊,当然!谢谢各位。实际上比这更糟糕的是,我在(非常旧的!)代码中编辑的模块有隐式REAL*8(a-h,o-z)这是什么,@francescalus?在回复一条评论几个月后,你会回来接受你的“接受答案”互联网积分吗?哦,那就继续吧;)我所学到的是,使用古老的Fortran代码的一个陷阱是,它没有任何隐式的none
s,而且生命太短,无法选择并正确键入所有变量。所以我在C++中重新编写了它。奇怪的是我在浏览器的选项卡上打开这个问题六个月。因此,有可能整理互联网和我的桌面上“未回答”的部分;)。