声明数组的不同语法:有和没有维度语句

Different syntaxes to declare arrays: with and without the dimension statement

我正在使用 gfortran 版本 7.2.0。我对 Fortran 很陌生。我知道有不同版本的 Fortran。在下面的代码中,我使用不同的语法声明数组(或实际上是张量)

program arrays
    implicit none

    integer :: m(3, 4)
    integer, dimension(3, 4) :: n

    print *, "m = ", m
    print *, "n = ", n

end program arrays

在一种情况下,我使用了 dimension 语句,而在另一种情况下我没有使用。该程序编译(没有错误)。我正在使用 gfortran 的标志 -g-fbounds-check。上述程序文件的文件扩展名为f.90

为什么在 Fortran 中明显声明数组有不同的语法? Fortran 的哪些版本支持哪些语法,或者是否可以声明 rankshapesextents数组至于 m 只是编译器的扩展?

声明

integer :: m(3, 4)
integer, dimension(3, 4) :: n

都是自 Fortran 90 以来的标准 Fortran。如果不使用 :: 第一行,如

integer m(3,4)

在 Fortran 90 之前有效。

在讨论其他内容之前,,dimension 不是维度 语句 而是属性规范。维度声明将是

dimension n(3,4)  ! With n implicitly or explicitly typed elsewhere

这里重要的是用类型声明指定的属性适用于(几乎)所有声明的对象。所以

integer :: m1(3,4), m2, m3
integer, dimension(3,4) :: n1, n2, n3

看到 m1 一个 rank-2 数组,但是 m2m3 标量(除非在其他地方给定数组属性或者实际上是函数)而 n1, n2n3 都是形状为 [3,4]

的 2 阶数组

问题的两个声明可以简单地

integer, dimension(3,4) :: m, n

"almost" 是因为我们可以拥有

integer, dimension(3,4) :: n, p(5)

其中 p 的形状是 [5],覆盖之前指定的 [3,4]