如何在 Fortran 中将一维数组指针指向可分配的二维数组



我想引用一个二维数组,其大小在运行时确定,作为一个一维数组,而不复制或改变原始数组。由于 Fortran 使用指向数组的指针而不是指针数组,因此直接使用指针在我尝试过的任何排列中都不起作用。 EQUIVALENCE似乎只适用于恒定大小的数组,TRANSFER返回一个副本。一维数组的具体顺序并不重要(即 [x11,x12,x13...][x11,x21,x31...]一样好(,但是当我改变二维数组时,我希望看到一维数组中反映的变化,反之亦然。

理想情况下,我可以做这样的事情:

program arr_as_vec
    implicit none
    real, allocatable, target :: arr(:,:)
    real, pointer :: vec(:)
    integer :: dim1, dim2 ! would really be determined at runtime
    dim1 = 3; dim2 = 5
    allocate(arr(dim1,dim2))
    call something_like_equivalence(arr, vec)
    arr(1,1) = 1
    arr(dim1,dim2) = 2
    print *, vec(1) ! should give 1
    print *, vec(dim1*dim2) ! should give 2
end program arr_as_vec

这可能吗?

使用指针重映射,以下内容在 gfortran 5.4.0 中按预期工作(由于 francescalus、roygvib 和 VladamirF 的帮助而编辑(:

program arr_as_vec
    implicit none
    real, allocatable, target :: arr(:,:)
    real, pointer :: vec(:)
    integer :: dim1, dim2 ! would really be determined at runtime
    dim1 = 3; dim2 = 5
    allocate(arr(dim1,dim2))
    vec(1:dim1*dim2) => arr
    arr(1,1) = 1
    arr(dim1,dim2) = 2
    print *, vec(1) ! should give 1
    print *, vec(dim1*dim2) ! should give 2
    print *, size(vec) ! should give 15
    vec(1) = 3
    print *, arr(1,1) ! should be 3
end program arr_as_vec

最新更新