Pointers 我可以使用指针在Fortran中创建子数组吗?

Pointers 我可以使用指针在Fortran中创建子数组吗?,pointers,fortran,arrays,Pointers,Fortran,Arrays,我希望能够拥有一个大型主阵列,并使用子阵列引用它的不同部分。目前,我正在使用偏移索引来实现这一点,但这样做可能会变得非常复杂 我可以有一个维度(9)的主数组和维度(3)的3个子数组,这样子数组1指向主数组的前3个元素,子数组2指向下3个元素,子数组3指向最后3个元素吗 例如,数组的定义如下: integer, dimension(9) :: master_array integer, dimension(3) :: sub_array1, sub_array2, sub_array3 阵列之间

我希望能够拥有一个大型主阵列,并使用子阵列引用它的不同部分。目前,我正在使用偏移索引来实现这一点,但这样做可能会变得非常复杂

我可以有一个维度(9)的主数组和维度(3)的3个子数组,这样子数组1指向主数组的前3个元素,子数组2指向下3个元素,子数组3指向最后3个元素吗

例如,数组的定义如下:

integer, dimension(9) :: master_array
integer, dimension(3) :: sub_array1, sub_array2, sub_array3
阵列之间的关系为:

sub_array1(1) -> master_array(1)
sub_array1(2) -> master_array(2)
sub_array1(3) -> master_array(3)

sub_array2(1) -> master_array(4)
sub_array2(2) -> master_array(5)
sub_array2(3) -> master_array(6)

sub_array3(1) -> master_array(7) 
sub_array3(2) -> master_array(8)
sub_array3(3) -> master_array(9)
此外,是否可以使用混合数据类型,以便在更大的整数主数组中有一个子实数数组


提前感谢您的帮助

是的,您可以使用绝对使用指针来指向数组的子区域。这在很多情况下都非常方便,例如用于PDE的模具计算:

program pointerviews
    real, dimension(10), target :: alldata
    real, dimension(:), pointer :: left
    real, dimension(:), pointer :: centre
    real, dimension(:), pointer :: right

    alldata = (/ (i, i=1,10) /)

    left  => alldata(1:8)
    right => alldata(3:10)
    centre=> alldata(2:9)


    print *, alldata
    print *, left
    print *, centre
    print *, right
    print *, (left - 2*centre + right)
end program pointerviews
FORTRAN中的数组指针不仅仅是地址,它们还包含数组大小、跨距和类型信息。因此,您可以做类似这样更疯狂的事情(如果您习惯使用C指针),并包括步幅:

program pointerviews2
    real, dimension(10), target :: alldata
    real, dimension(:), pointer :: left
    real, dimension(:), pointer :: centre
    real, dimension(:), pointer :: right

    alldata = (/ (i, i=1,10) /)

    left  => alldata(1:8:2)
    right => alldata(3:10:2)
    centre=> alldata(2:9:2)

    print *, alldata
    print *, left
    print *, centre
    print *, right

    print *, 'Changing alldata(4) = 9999'
    alldata(4) = 9999.

    print *, alldata
    print *, left
    print *, centre
    print *, right

end program pointerviews2

但是,根据定义,数组的区域不能与其他数据的类型不同。如果您想要一个包含多种类型数据的变量,您必须使用派生类型或多态性。

谢谢,这正是我想要的。我在想你是否知道GPU编程和CUDA?我试图在CUDA中对共享内存数组做同样的事情,但这似乎不可能,因为“指针”和“目标”属性与“共享”属性冲突。即使在CUDA C中,共享内存的属性也有点奇怪(尽管在OpenCL中很好);我不知道pg fortran对它们的支持是什么样的。。