Сохранить границы в распределении в присваивании - PullRequest
3 голосов
/ 13 мая 2019

Я использую автоматическое распределение при назначении, чтобы вычислить разницу двух массивов с границами, начинающимися с 0:

program main
   implicit none
   integer, allocatable :: a(:), b(:), c(:)

   allocate(a(0:10))
   allocate(b(0:10))

   a = 1
   b = 2

   write (*,*) lbound(a)
   write (*,*) lbound(b)

   c = b - a

   write (*,*) lbound(c)
end program main

Оба, gfortran и ifort дают вывод:

       0
       0
       1

Почему c не может иметь такие же границы, как a и b?Есть ли краткий и краткий (без явного выделения) способ убедиться, что c имеет те же границы?

Ответы [ 2 ]

3 голосов
/ 14 мая 2019

Рассмотрим встроенный оператор присваивания, в котором левая часть не выделена и является массивом:

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)
2 голосов
/ 13 мая 2019

Почему c не может иметь те же границы, что и und b?

Поскольку он должен быть назначен той же форме, что и a и b, и начинаться с 1. (В любом случае b-a является выражением и также начинается с 1, но это не важно. Что если b и a начинаются с разных индексов?)

Есть ликраткий и краткий (без явного выделения) способ убедиться, что c имеет одинаковые границы?

Нет.Но вы можете по крайней мере явно выделить с помощью mold=a или source=a.

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