【问题标题】:How to point 1-D array pointer to allocatable 2-D array in Fortran [duplicate]如何在Fortran中将一维数组指针指向可分配的二维数组[重复]
【发布时间】:2018-01-15 22:27:43
【问题描述】:

我想引用一个二维数组,它的大小在运行时确定,作为一个一维数组,而不复制或改变原始数组。由于 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

这可能吗?

【问题讨论】:

  • 您可能会发现some of these techniques 很有用。尤其是重新映射。
  • @francescalus 我读到了,但是在使用ptr(1:n,1:n) => vector 时出现错误。不过,我确实想出了办法,但解决方案很简单,我感到很尴尬。
  • @MichaelGreenburg 我以前在您的回答中使用过类似的方法,但现在vec(1:size(arr)) => arr 不起作用吗? (尽管vec => arr 给了我一个错误)

标签: fortran


【解决方案1】:

使用指针重新映射,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

【讨论】:

  • 这真是不必要的复杂。您是否阅读过链接stackoverflow.com/questions/48271556/… 并搜索过指针重映射?这个问题甚至可能与您的问题重复。
  • @VladimirF 在切换编译器(到 gfortran 5.4.0)时,重新映射工作完美。谢谢!
  • 我将关闭问题并将其指向另一个问题。你还可以保留它,不要删除它。关闭不等于删除。
猜你喜欢
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
  • 2020-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多