Выделение массивов одинакового размера - PullRequest
11 голосов
/ 27 января 2012

Я бы хотел выделить массив B такой же формы , а иметь те же нижнюю и верхнюю границы, что и другой массив A. Например, я мог бы использовать

allocate(B(lbound(A,1):ubound(A,1), lbound(A,2):ubound(A,2), lbound(A,3):ubound(A,3)))

Но это не только не элегантно, но и очень раздражает массивы (даже) более высоких измерений.

Я надеялся на что-то похожее на

allocate(B(shape(A)))

, который не работает, и даже если бы это сработало, каждое измерение начиналось бы с 1, а это не то, чего я хочу.

Кто-нибудь знает, как я могу легко выделить массив для того же размера и границ, что и другой массив, для произвольных размеров массива?

Ответы [ 3 ]

12 голосов
/ 17 января 2015

Начиная с Fortran 2008, теперь есть необязательный аргумент MOLD:

ALLOCATE(B, MOLD=A)

Спецификатор MOLD = работает почти так же, как SOURCE =. Если вы указали MOLD =, а source_expr - переменная, ее значение не нужно определять. Кроме того, MOLD = не копирует значение source_expr в переменную, которая будет выделена.

Источник: IBM Fortran Ref

8 голосов
/ 27 января 2012

Вы можете определить его в директиве препроцессора, но это будет с фиксированной размерностью:

#define DIMS3D(my_array) lbound(my_array,1):ubound(my_array,1),lbound(my_array,2):ubound(my_array,2),lbound(my_array,3):ubound(my_array,3)

allocate(B(DIMS3D(A)))

не забудьте скомпилировать, например, опция -cpp (гфортран)

Если вы используете Fortran 2003 или выше, вы можете использовать аргумент источника:

allocate(B, source=A)

но это также скопирует элементы A в B.

5 голосов
/ 28 января 2012

Если вы делаете это много и думаете, что это слишком уродливо, вы можете написать свою собственную подпрограмму, чтобы позаботиться об этом, copy_dims (template, new_array), инкапсулирующую строку исходного кода, которую вы показываете.Вы могли бы даже настроить универсальный интерфейс, чтобы он мог обрабатывать массивы нескольких рангов - см. , как написать оболочку для 'allocate' , для примера этой концепции.

...