添加元素到FORTRAN指针?

时间:2015-07-14 13:53:36

标签: arrays pointers fortran

我在fortran中有一个数组arr来自1 to n我需要针对前面和后面的元素测试每个元素(即i针对i-1和{{ 1}}) - 问题是元素i+11分别具有nn作为前任或后继(即循环)。

我不是分别测试第一个和最后一个元素,而是运行一个循环:

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)

然而,可能有一种更简单的方法我不知道,因为指针的类型数组再次使代码不能很好地读取。

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)。