Указатель FORTRAN, охватывающий несколько массивов

Я работаю над проектом, в котором у меня есть несколько массивов одинакового размера в 1-м, 2-м и 3-м измерениях, хотя размеры могут различаться в 4-м измерении.

Я хотел бы сгруппировать эти массивы, создав указатель, который объединяет эти массивы.

Чтобы сделать это менее абстрактным, скажем, у меня есть 2 массива:

A (size: N1 x N2 x N3 x N4a)
B (size: N1 x N2 x N3 x N4b)

в предыдущих версиях проекта эти массивы копировались в массив C размера N1 x N2 x N3 x (N4a + N4b), который затем передавался в подпрограмму для выполнения fft на этом массиве.

Я хотел бы избежать этой операции копирования и построить указатель p, который содержал бы те же данные, что и массив C в предыдущей версии, но без явного копирования и дополнительного выделения памяти.

Возможно ли это на Фортране?


person wvm    schedule 14.11.2013    source источник


Ответы (2)


Нет. Указатель не может одновременно указывать на два независимых друг от друга объекта.

В зависимости от вашей ситуации может быть целесообразно начать с массива размерности (N1,N2,N3,N4a+N4b), а затем связать A и B (указатель, хранилище или аргумент) с соответствующими частями этого массива. начальный большой массив каким-то образом.

REAL, TARGET :: c(N1,N2,N3,N4a+N4b)
REAL, POINTER :: a(:,:,:,:)
REAL, POINTER :: b(:,:,:,:)

a => c(:,:,:,:n4a)
b => c(:,:,:,n4a+1:)
! Go forth and do things with a and b.

! Then later do things with c.

В темные времена, до того, как в Фортране появилось какое-либо динамическое распределение памяти, этот тип «один массив для управления всеми», который затем был разделен, был обычным явлением.

person IanH    schedule 15.11.2013

Раньше вы размещали их в коммуникационном блоке и передавали первый как предполагаемый размер. Правила ассоциации последовательностей заставляют его работать. Это сработает только в том случае, если размеры будут фиксированными.

Примечание: пожалуйста, не минусуйте только потому, что вам не нравятся старые программы, а покажите, что они не работают.

person Vladimir F    schedule 15.11.2013
comment
Хорошо, я не буду минусовать тебя, но ты только что передал лезвие бритвы маленькому ребенку. Только потому, что это было приемлемо, когда я был молодым человеком, я не горжусь этим сегодня. - person High Performance Mark; 15.11.2013