Рассмотрим встроенный оператор присваивания, в котором левая часть не выделена и является массивом:
variable = expr
В этом случае массив variable
выделяется в форме выражения expr
, с нижней границей, равной значению LBOUND(expr)
(см. Fortran 2018 10.2.1.3).
Для примера вопроса
c = b - a
правая частьвыражение b-a
.Для этого выражения LBOUND(b-a)
равно 1: b-a
не является целым массивом (F2018 16.9.109).Таким образом, нижняя граница c
при выделении равна 1.
Единственный способ, которым переменная, присваиваемая во внутреннем присваивании с распределением, чтобы иметь нижнюю границу не 1, это для правой стороны иметь нижнюю границу, а не 1. В присваивании (c
не выделено)
c = b
, тогда c
имеет нижнюю границу, равную b
.
Вы можете избежать явного оператора allocate с помощью
c = b
c = c - a
но это довольно неясно, и (повторяя точку в ответе Владимира Ф.) вы бы хотели, чтобы нижняя граница составляла b
или a
, если они различаются.
Длякомплектность:
allocate(c(7:17), source=b-a)