Fortran 90 在复制到另一个可分配数组后不保留 lower/upper 数组边界
Fortran 90 doesn't keep lower/upper array bounds after copy to another allocatable array
这行不通
program main
implicit none
integer :: nx = 3
integer :: ny = 5
integer :: nz = 8
real, allocatable, dimension(:,:,:) :: A
real, allocatable, dimension(:,:) :: B
allocate(A(nx,0:ny,nz) )
! ...do something with array A and at some point cope a slice of A to B:
B = A(:,:,1)
! in this case B is (1:nx, 1: ny+1)
end program main
上面的代码自动分配 B 并将 A(:,:,1) 复制到 B。但是它没有保持 0/ny 的 lower/upper 界限,而是 B 的下限为 1上限为 ny+1.
我发现保持 A 2dn-dim 的 lower/upper 边界的唯一方法是显式分配 B 为:
allocate(B(nx, 0:ny))
B = A(:,:,1)
! in this case B is (1:nx, 0:ny)
考虑到我的变量比这个简单的例子多得多,有没有办法像 B=A(:,:,1) 那样赋值,并且在不显式分配 B 的情况下保持 A 的边界?
A(:,:,1)
是一个表达式。它有边界(1:nx, 1:ny)
,两个等级都从1开始。它不是原来的数组,它是一个新的表达式。
然而,即使它是一个有其他下界的数组,自动分配总是从1开始分配索引。基本上,右边又是一个表达式。
对于您的情况,您必须明确分配。
您可以使用:
allocate(B(lbound(A,1):ubound(A,1), lbound(A,2):ubound(A,2)))
这行不通
program main
implicit none
integer :: nx = 3
integer :: ny = 5
integer :: nz = 8
real, allocatable, dimension(:,:,:) :: A
real, allocatable, dimension(:,:) :: B
allocate(A(nx,0:ny,nz) )
! ...do something with array A and at some point cope a slice of A to B:
B = A(:,:,1)
! in this case B is (1:nx, 1: ny+1)
end program main
上面的代码自动分配 B 并将 A(:,:,1) 复制到 B。但是它没有保持 0/ny 的 lower/upper 界限,而是 B 的下限为 1上限为 ny+1.
我发现保持 A 2dn-dim 的 lower/upper 边界的唯一方法是显式分配 B 为:
allocate(B(nx, 0:ny))
B = A(:,:,1)
! in this case B is (1:nx, 0:ny)
考虑到我的变量比这个简单的例子多得多,有没有办法像 B=A(:,:,1) 那样赋值,并且在不显式分配 B 的情况下保持 A 的边界?
A(:,:,1)
是一个表达式。它有边界(1:nx, 1:ny)
,两个等级都从1开始。它不是原来的数组,它是一个新的表达式。
然而,即使它是一个有其他下界的数组,自动分配总是从1开始分配索引。基本上,右边又是一个表达式。
对于您的情况,您必须明确分配。
您可以使用:
allocate(B(lbound(A,1):ubound(A,1), lbound(A,2):ubound(A,2)))