Подразумевается, делать конструкцию повторяющихся скалярных значений в конструкторе массива - PullRequest
4 голосов
/ 24 июня 2019

Я пытаюсь выяснить, почему размещение скаляра перед конструкцией do внутри конструктора массива дает ответ, который он делает.

В целом, я понимаю конструкцию do, что (/(i,i=1,5)/) эквивалентнов (/1,2,3,4,5/).

real, dimension(4) :: a
integer :: i
a=(/(50,i,i=1,2)/)

. Получает массив 50.0000000, 1.00000000, 50.0000000, 2.00000000.В лучшем случае я бы ожидал ошибку, потому что размер шага не дает достаточно значений для заполнения массива.

1 Ответ

4 голосов
/ 24 июня 2019

Массив, созданный с несколькими 50 s, является ожидаемым.

Часть текста вопроса не соответствует тому, что происходит с кодом:

размещение скаляра перед конструкцией do внутри конструктора массива

В [(50,i,i=1,2)] (для ясности используется Fortran 2003 [...]) скалярное значение 50 не "до" подразумеваемого do, а является его явной частью. Это можно сравнить с

a = [50, (i,i=1,3)]

, что приведет к созданию массива [50, 1, 2, 3].

Формальный синтаксис для подразумеваемого do конструктора массива:

( список значений AC , AC-Implied-Do-Control )

, поэтому можно видеть, что несколько значений могут быть частью диапазона подразумеваемого управления do, даже если оно является обычным для использования только одного значения. С такими множественными значениями все они оцениваются для каждой итерации подразумеваемого do (и 50 оценивает одно и то же каждый раз) и используются в конструкции массива.

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