Fortran中的0大小数组边界问题

4

在Fortran中分配零大小的数组时,我得到了令人费解的行为。

以下是代码:

program test_zerosized
  implicit none
  integer, allocatable :: a(:),b(:)
  allocate(a(0))
  print *, ' a lower bound = ',lbound(a,1)
  print *, ' a upper bound = ',ubound(a,1)

  allocate(b(0:0))
  print *, ' b lower bound = ',lbound(b,1)
  print *, ' b upper bound = ',ubound(b,1)
  return
end program test_zerosized

产生以下输出:
  a lower bound =            1
  a upper bound =            0
  b lower bound =            0
  b upper bound =            0

我的编译器(gcc/gfortran 6.2.0)是否符合标准?我不明白为什么lbound(a,1)==1而不是lbound(a,1)==0,因为总的数组大小为零元素。谢谢!


3
如果Lbound(a)=0且Ubound(a)=0,它的大小不为零,它有一个元素,即a(0)。 - Ian Bush
1个回答

4
你观察到的结果是正确的行为。
数组a大小为零,而lbound适用于这种数组(F2008,13.7.90)(我强调):

如果ARRAY是整个数组,并且ARRAY是秩DIM的假设大小数组或者ARRAY的维度DIM具有非零范围,则LBOUND(ARRAY,DIM)的值等于ARRAY的下标DIM的下限。否则,结果值为1。

ubound以补充的方式工作。
将此与下限为零且上限为零的大小为1的数组b进行比较。 a的可分配性质不相关,使用显式形状数组的大小为零的情况将产生相同的结果。

1
明白了,谢谢@francescalus。从某种意义上说,标准希望基于边界的大小检查是一致的:对于数组a,size(a) == ubound(a)-lbound(a)+1 == 0-1+1 == 0,而对于数组b,size(b) == ubound(b)-lbound(b)+1 == 0-0+1 == 1,正如@Ian Bush指出的那样,其中包含1个元素。 - Federico Perini
确实(要考虑个人等级的范围/界限/大小)。 - francescalus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接