【问题标题】:Can I create sub arrays in Fortran using pointers?我可以使用指针在 Fortran 中创建子数组吗?
【发布时间】:2011-03-20 16:35:23
【问题描述】:

我希望能够拥有一个大型主数组并使用子数组引用它的不同部分。目前我正在使用偏移索引来执行此操作,但这样做会变得非常复杂。

我可以有一个维度 (9) 的主数组和 3 个维度 (3) 的子数组,这样 sub_array1 指向 master_array 的前 3 个元素,sub_array2 指向接下来的 3 个元素,sub_array3 指向最后一个元素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)

此外,是否可以使用混合数据类型,以便在更大的整数主数组中拥有一个实数子数组?

提前感谢您的帮助

【问题讨论】:

    标签: pointers fortran arrays


    【解决方案1】:

    是的,您可以使用绝对使用指针来指向数组的子区域。这在很多情况下都非常方便,例如 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 对他们的支持是什么样的..
    猜你喜欢
    • 2012-03-10
    • 2021-10-17
    • 2021-12-01
    • 2013-08-28
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    相关资源
    最近更新 更多