Границы массива с массивом 0 в Фортране - PullRequest
0 голосов
/ 20 ноября 2018

При выделении массивов нулевого размера в Фортране я получаю противоречивое поведение.

Этот код:

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 Ответ

0 голосов
/ 20 ноября 2018

Результат, который вы наблюдаете, является правильным.

Массив a имеет нулевой размер, и lbound работает с такими массивами (F2008, 13.7.90) (мой акцент):

Если ARRAY является целым массивом и ARRAY является массивом предполагаемого размера ранга DIM или измерение DIM ARRAY имеет ненулевой экстент , LBOUND (ARRAY, DIM) имеет значение, равноек нижней границе для нижнего индекса DIM ARRAY. В противном случае значение результата равно 1.

ubound работает дополняющим образом.

Сравните это с массивом size-1 b с меньшимограниченный ноль и верхний предел ноль.

Распределяемая природа a не имеет значения, и вы увидите тот же результат с явным массивом фигур нулевого размера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...