指向多个非连续数组切片的指针

时间:2017-11-06 04:27:34

标签: arrays pointers fortran

给定1D数组,我想创建一个指向数组边界的指针,比如数组的前2个和后2个元素。我已经对此进行了一些调查,但我遇到的唯一不连续的指针示例是定义为跨步访问的那些。

给出以下测试用例

program test
    implicit none

    integer, target :: a(10)
    integer, pointer :: p(:)
    integer :: i

    do i=1,10
        a(i)=i
    end do

    p => a(:)   ! Point all
    p => a(::2) ! Point every 2 elments

    print*, p
end program test

如何使用单个指针指向原始数组的分隔数组切片?所以要清楚,在这个例子中打印p时我想得到1 2 9 10

1 个答案:

答案 0 :(得分:0)

你不能做一个完全通用的指针。它是数组的重点,它们结构良好,可以按顺序访问。这就是他们必须跨步的原因。

在你的情况下,你仍然有一些结构,所以你可以使用2D数组指向那些对。

这是一个例子。equivalence。但是,对于标准Fortran中的未知原因,等效性不能与target一起使用。

可以使用2D指针p作为:

integer, pointer :: p(:,:), b(:,:)

b(1:2,1:5) => a

p => b(:,1::4)

但是,就我所见,此处还需要2D指针p

你也可以使用C风格的演员阵容进行第一次重新制作,但是可能没用:

type(c_ptr) ptr

ptr = c_loc(a)
call c_f_pointer(ptr, b, [2,5])

p =>  b(:,1::4)

我找不到使用1D指针的方法。