我正在开展一个项目,我在第一,第二和第三维度上有许多相同大小的数组,尽管第四维的大小可能会有所不同。
我想通过构造一个连接这些数组的指针来对这些数组进行分组。
为了使这不那么抽象,假设我有2个数组:
A (size: N1 x N2 x N3 x N4a)
B (size: N1 x N2 x N3 x N4b)
在项目的早期版本中,这些数组被复制到大小为N1 x N2 x N3 x (N4a + N4b)
的数组C,然后传递给子程序以在此数组上执行ffts。
我想避免这种复制操作并构造一个指针p
,它将包含与先前版本中的数组C相同的数据,但没有显式复制和额外的内存分配。
Fortran有可能吗?
答案 0 :(得分:1)
没有。指针不能同时指向两个独立的对象。
根据您的情况,可能可行的是从维度(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.
在黑暗时期,在Fortran拥有任何类型的动态内存分配之前,这种单阵列到规则的所有内容然后被分解出来是常用的。
答案 1 :(得分:0)
在过去,你会把它们放在一个commn块中,并按照假设的大小传递第一个。序列关联规则使其有效。只有在尺寸固定的情况下,这才有效。
注意:请不要仅因为您不喜欢旧程序而进行downvote,而是表明它不起作用。