Fortran中大小为0的数组的数组边界

时间:2018-11-20 13:31:03

标签: arrays fortran bounds allocatable-array

在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,因为数组的总大小为零元素。谢谢!

1 个答案:

答案 0 :(得分:4)

您观察到的结果是正确的行为。

数组a的大小为零,lbound可在此类数组上使用(F2008,13.7.90)(我强调):

  

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

ubound以互补的方式工作。

将其与大小为1的数组b(下限为零,上限为零)进行比较。

a的可分配性质无关紧要,并且在零大小的显式形状数组中,您会看到相同的结果。