0

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

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

当我用 编译时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)

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

4

2 回答 2

5

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

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

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

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

同样,局部变量的属性(其形状)a取决于虚拟参数的值。这使变量a成为自动数据对象。不允许自动数据对象具有 SAVE 属性(对象的属性可能因调用而异,这与 SAVE 在调用之间维护值不一致)。提供初始化器也意味着 SAVE 属性。

如果n是参数而不是虚拟参数,则代码将符合要求。

于 2013-03-08T01:35:47.840 回答
2

正如 IanH 已经解释的那样,这里有两个允许的示例。在一种情况下,初始化程序是一个常量表达式,因为M它是一个参数。另一方面,虽然初始化不是常量表达式,但它不是声明的一部分。

program test5
  integer :: j
  integer :: n = 3
  integer, parameter :: M = 4
  integer, dimension(3*(M-1)) :: b = [ (j,j=4,3*M,1) ]

  write (*,*) b
  call it(n)

contains

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

end program test5
于 2013-03-08T01:41:16.047 回答