Все три способа копирования массивов, которые вы упомянули, цикл do
, b(1:n) = a(1:n)
и b = a
эквивалентны; они копируют содержимое массива a
в массив b
. a
и b
— это просто массивы, а не причудливые указатели или что-то в этом роде, поэтому присваивание a = b
в основном совпадает с математическим выражением. Нет никакого волшебства со ссылками (о которых пользователь должен знать), поэтому Fortran — довольно простой язык для изучения. У вас могут быть массивы указателей в Fortran, но это совсем другая проблема.
Объяснение Fortran 90/95 М. Меткалфа и Дж. Рида всегда является хорошим справочным материалом для получения консультаций по возможностям языка Fortran. Со страницы 48:
3.11 Назначение массива
С помощью внутреннего присваивания выражение массива может быть присвоено переменной массива той же формы, что интерпретируется так, как если бы каждый элемент выражения был присвоен соответствующему элементу переменной. Например, с объявлениями
real, dimension(10, 20) :: a
Назначение
a = a + 1.0
заменяет a(i,j)
на a(i,j) + 1.0
для i=1,2..,10
и j=1,2,..,20
.
Также обратите внимание, что скалярное выражение может быть присвоено массиву, и в этом случае значение saclar передается всем элементам массива.
С точки зрения того, как все это на самом деле реализовано, к чему, я думаю, вы ведете свой вопрос, это совершенно не указано в стандарте Fortran. Такого рода вещи оставлены неопределенными, чтобы позволить авторам компиляторов делать любые оптимизации, которые им нужны. Например, в присваивании a = b
порядок, в котором элементы b
копируются в a
, стандартом не определен, поэтому разные компиляторы могут делать это по-разному. Все, что вам нужно знать, это то, что для этого вопроса, если a
и b
не являются указателями, то a
и b
являются разными массивами и что изменение элемента одного не изменяет соответствующий элемент другого. Таким образом, a=b
— это глубокая копия, и вы можете думать об этом как о копировании всех элементов в b
в ячейку памяти a
.
person
Chris
schedule
03.08.2012