Границы массива с массивом 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 не имеет значения, и вы увидите тот же результат с явным массивом фигур нулевого размера.

Другие вопросы по тегам