compilation - 此 FORTRAN 代码不应编译。这是有原因的吗?

标签 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

最佳答案

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

不过,答案要平凡得多。

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

关于compilation - 此 FORTRAN 代码不应编译。这是有原因的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27321711/

相关文章:

C# 编译器可以折叠返回常量的函数吗?

numpy - Numpy 函数的 Fortran 等价物

C++/Fortran 混合编程 : undefined reference to `_gfortran_reshape_r8'

fortran - 等价陈述

Fortran 90 存在可选参数

java - 在运行时重新编译对象

command-line - 从命令行使用 jar 依赖项编译 Kotlin

python - f2py:在与 python 交互时在 fortran 中指定真正的精度?

fortran - 从 Intel 移植到 GNU gfortran 时的可变格式语句

c++ - 如何构建boost序列化库