分配零大小的数组并在数组构造函数中使用

roy*_*vib 3 arrays fortran allocation

在下面的代码中,我试图分配一个大小为0的空数组,然后使用自动重新分配添加更多元素:

integer, allocatable :: a(:)

allocate( a(0) )        ! Line 1
print *, size( a )
print *, "a(:) = ", a

a = [ a, 1 ]
print *, "a(:) = ", a

a = [ a, 2 ]
print *, "a(:) = ", a

!! Error
! a = []
! a = [ integer :: ]
Run Code Online (Sandbox Code Playgroud)

此代码给出了预期的结果(例如,使用gfortran或ifort -assume realloc_lhs)

           0
 a(:) = 
 a(:) =            1
 a(:) =            1           2
Run Code Online (Sandbox Code Playgroud)

这里有三个问题:

  • 首先,分配零大小的数组是否可以allocate( a( 0 ) )
  • 如果省略这样的显式分配,会a(:)自动初始化为零大小的数组吗?(实际上,即使我在第1行注释掉,代码似乎也能正常工作.)
  • 在数组构造函数中包含零大小的数组是没有问题的a = [a, 1]吗?(我也尝试使用像a = []或的空数组构造函数a = [integer::],但是它们没有编译,所以似乎是不允许的.)

编辑

如果我a = []在上面的代码中取消注释,gfortran5.3会给出错误消息:

Error: Empty array constructor at (1) is not allowed
Run Code Online (Sandbox Code Playgroud)

但如果我只取消注释该线a = [ integer :: ],它没有问题!因为我最初同时取消了这两行,我误解了这两种方式都是非法的,但实际上后者似乎没问题(请参阅@francescalus答案).

Hig*_*ark 7

1是的.Fortran很酷,有0个大小的阵列.

2 a(:)不是数组而是数组部分(尽管是包含整个数组的数组).未定义自动重新分配以在数组部分上工作,因此

allocate(a(0))
a(:) = [1 2 3]
Run Code Online (Sandbox Code Playgroud)

不起作用.在我的测试中,代码已编译并执行但仍a保留0大小.

至于代码是否a = [a,1]应该工作,如果a以前没有分配(0-或任何其他大小)我的标准读取是这不符合标准,你的编译器(我的)也是错误的.我希望这是我对标准的误读.也许其他人会来并正确解释.

3是的

allocate(a(0))
a = [a, 1]
Run Code Online (Sandbox Code Playgroud)

很好,它符合标准,并按照您的期望工作.正如您所注意到的,在自动分配中不允许使用空数组构造函数