我在fortran中有一个数组arr
来自1 to n
我需要针对前面和后面的元素测试每个元素(即i
针对i-1
和{{ 1}}) - 问题是元素i+1
和1
分别具有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)
)
上述方法不起作用,因为指针的每个新定义都会覆盖前一个。所以问题出现了:
有没有办法在不删除以前定义的情况下将元素实际添加到指针数组?
PS:
作为当前的解决方法,我使用带有指针的可分配类型数组:
arr(i)%vec(1:m)
虽然如下替换循环不起作用:
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)
然而,可能有一种更简单的方法我不知道,因为指针的类型数组再次使代码不能很好地读取。
答案 0 :(得分:1)
我不认为有一种方法可以按照你想象的方式使用指针。相反,我建议使用尺寸为0:N+1
的整数数组映射到所需的1:N
范围。例如:
integer :: i(0:N+1), j
real :: a(N)
! -- Setup
do j=1,N
i(j) = j
enddo
i(0) = N
i(N+1) = 1
! -- Then you can do:
do j=1,N
! call mysub(a(i(j-1)), a(i(j)), a(i(j+1)))
enddo
或者,您可以使用函数来定义i(j)。