在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
,因为数组的总大小为零元素。谢谢!
答案 0 :(得分:4)
您观察到的结果是正确的行为。
数组a
的大小为零,lbound
可在此类数组上使用(F2008,13.7.90)(我强调):
如果ARRAY是整个数组,并且ARRAY是秩DIM的假定大小的数组,或者ARRAY的维度DIM具有非零范围,则LBOUND(ARRAY,DIM)的值等于下限值绑定到ARRAY的下标DIM。 否则结果值为1。
ubound
以互补的方式工作。
将其与大小为1的数组b
(下限为零,上限为零)进行比较。
a
的可分配性质无关紧要,并且在零大小的显式形状数组中,您会看到相同的结果。