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

在Fortran中如何将一维数组指针指向可分配的二维数组,fortran,Fortran,我想引用一个二维数组,其大小在运行时确定,作为一个一维数组,而不复制或修改原始数组。因为Fortran使用指向数组的指针而不是指针数组,所以直接使用指针在我尝试过的任何排列中都不起作用equality似乎只在大小不变的数组上起作用,TRANSFER返回一个副本。一维数组的具体顺序并不重要(即[x11,x12,x13…]与[x11,x21,x31…]一样好),但当我改变二维数组时,我希望看到一维数组中反映的变化,反之亦然 理想情况下,我可以这样做: program arr_as_vec

我想引用一个二维数组,其大小在运行时确定,作为一个一维数组,而不复制或修改原始数组。因为Fortran使用指向数组的指针而不是指针数组,所以直接使用指针在我尝试过的任何排列中都不起作用
equality
似乎只在大小不变的数组上起作用,
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的帮助而编辑)可以按预期工作:


你会发现这很有用。特别是重新映射。@francescalus我读到了,但是在使用
ptr(1:n,1:n)=>vector
时出错了。不过,我确实找到了解决方法,而且觉得很不好意思,因为解决方案很简单。@MichaelGreenburg我以前在你的回答中也使用过类似的方法,但现在这个
vec(1:size(arr))=>arr
不起作用了吗?(虽然
vec=>arr
给了我一个错误)这真的是不必要的复杂。您是否阅读了链接并搜索了指针重新映射?这个问题甚至可能是你的问题的翻版。@VladimirF在切换编译器(到gfortran 5.4.0)时,重新映射工作非常完美。非常感谢。我将结束这个问题,并指出另一个问题。你仍然可以保留它,不要删除它。关闭与删除不同。
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