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