【发布时间】:2015-07-14 13:53:35
【问题描述】:
我在 fortran 中有一个数组 arr 从 1 to n 开始,我需要根据前面和后面的元素测试每个元素(即 i 和 i-1 和 i+1) - 问题是元素 @ 987654326@ 和 n 分别具有 n 或 1 作为前任或后继(即循环)。
与其分别测试第一个和最后一个元素,我宁愿运行如下循环:
do i=1,n
call testi(i-1,i,i+1)
end do
并定义一个指针(为了不使用虚拟数组和两倍的内存)
arrpointer(0) => arr(n)
arrpointer(1:n) => arr(1:n)
arrpointer(n+1) => arr(1)
“模拟”我的数组中的循环。 (注意每个数组元素都是一个向量——arr(i)%vec(1:m))
上述方法不起作用,因为指针的每个新定义都会覆盖以前的定义。那么问题来了:
有没有什么方法可以在不删除之前定义的情况下,将元素实际添加到指针数组中?
PS:
作为当前的解决方法,我使用带有指针的可分配类型数组:
type :: pointerarray
real, pointer :: elementpointer(:)
end type pointerarray
type(pointerarray), allocatable :: arrpointer(:)
arrpointer(0)%elementpointer => arr(n)
do i=1,n
arrpointer(i)%elementpointer => arr(i)
end do
arrpointer(n+1)%elementpointer => arr(1)
虽然替换循环如下不起作用:
arrpointer(1:n)%elementpointer => arr(1:n)
但是可能有一种我不知道的更简单的方法,因为指针的类型数组再次使代码不那么可读。
【问题讨论】:
-
我不确定这里的问题是什么......但是你不能在 Fortran 中拥有一个没有派生类型的指针数组。因此,您的“解决方法”实际上是实现这一点的最简单方法。
-
如果您只想对数组进行循环测试,那么您会对不涉及指针的答案感到满意吗?我觉得提出你关于指针的问题的背景自然根本不涉及指针。
-
@alexander-vogt 谢谢你的意见 - 我只是相信一个更优雅的解决方案
-
@francescalus 我想插入一个虚拟数组 - 但我担心这会消耗太多时间。
-
dimension(:), pointer不是指针数组,而是指向数组的指针(您可能知道)。一个是相当受限于可以指出的内容。那么,简单的答案是“不”。如果您真的想使用指针而不是其他方法,我们可以提出一些建议,但我想说其他方法可能更直观/简单。