3

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

4

1 回答 1

4

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

该数组a的大小为零,并且lbound适用于此类数组(F2008,13.7.90)(我的重点):

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

ubound以互补的方式工作。

b将此与下限为零和上限为零的 size-1 数组进行比较。

的可分配性质a是不相关的,您会看到与零大小的显式形状数组相同的结果。

于 2018-11-20T13:49:53.863 回答