【问题标题】:Array bounds with 0-sized array in FortranFortran 中 0 大小数组的数组边界
【发布时间】:2018-11-20 21:49:53
【问题描述】:

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

【问题讨论】:

  • 好吧,如果 Lbound( a ) = 0 且 Ubound( a ) = 0 它的大小不是零,则有 1 个元素,即 a( 0 )

标签: arrays fortran bounds allocatable-array


【解决方案1】:

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

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

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

ubound 以互补的方式工作。

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

a 的可分配性质无关紧要,如果使用大小为零的显式形状数组,您会看到相同的结果。

【讨论】:

  • 知道了,谢谢@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 个元素
  • 确实(注意根据个人等级考虑范围/边界/大小)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-27
  • 1970-01-01
  • 2014-03-02
  • 2020-04-19
  • 2011-09-30
  • 1970-01-01
相关资源
最近更新 更多