gfortran没有编译隐含的do循环

ast*_*y13 0 arrays fortran gfortran

我正在尝试按如下方式初始化数组:

program test
  n = 3
  call it(n)

contains

subroutine it(n)
  integer n,j
  integer, dimension(3*(n-1)) :: a=(/(j,j=4,3*n,1)/)
  write(*,*) a
end subroutine it

end program test
Run Code Online (Sandbox Code Playgroud)

当我编译时gfortran -o test.exe test.f,我收到以下错误:

test.f:9.43:

        integer, dimension(3*(n-1)) :: a=(/(j,j=4,3*n,1)/)
                                           1
Error: Invalid character in name at (1)
Run Code Online (Sandbox Code Playgroud)

问题是什么?据我了解,这是符合标准的代码.

Ian*_*anH 5

编译器错误可能令人困惑,但示例代码不符合标准.

类型声明语句中的初始化程序必须是常量表达式.此外,自动数据对象可能没有SAVE属性.

初始化(没有限定形容词)只在Fortran中发生一次,在程序开始执行之前.因此,初始化程序中使用的表达式必须是可以在程序开始执行之前进行评估的表达式(此类表达式中允许的内容的细节(以及术语的各个方面)取决于您要编写的Fortran标准).

示例代码中的初始化程序取决于n的值,这是一个伪参数.在程序开始执行之前,您不能引用伪参数的值 - 它本身不是常量.

类似地,a局部变量的属性(其形状)取决于伪参数的值.这使变量a成为自动数据对象.不允许自动数据对象具有SAVE属性(对象的属性可能因呼叫而异,这与SAVE维持从调用到调用的值不一致).提供初始值设定项也意味着SAVE属性.

如果n是参数而不是伪参数,则代码将符合.