Границы массива с массивом 0 в Фортране
При распределении массивов нулевого размера в Фортране я получаю противоречивое поведение.
Этот код:
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 ответ
В результате вы наблюдаете правильное поведение.
Массив a
нулевого размера, и lbound
работает на таких массивах (F2008, 13.7.90) (мой акцент):
Если ARRAY является целым массивом и либо ARRAY является массивом предполагаемого размера ранга DIM, либо размерность DIM ARRAY имеет ненулевой экстент, LBOUND (ARRAY, DIM) имеет значение, равное нижней границе для нижнего индекса DIM ARRAY. В противном случае значение результата равно 1.
ubound
работает дополняющим образом.
Сравните это с массивом размера 1 b
с нижней границей ноль и верхней границей ноль.
Распределяемый характер a
не имеет значения, и вы увидите тот же результат с явным массивом фигур нулевого размера.