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)))