3

这不起作用

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 的下/上限,而是 B 的下限为 1,上限为 ny+1 .

我发现保持 A 2dn-dim 的下限/上限的唯一方法是将 B 显式分配为:

   allocate(B(nx, 0:ny))
   B = A(:,:,1)
   ! in this case B is (1:nx, 0:ny)

鉴于我有比这个简单示例更多的变量,有没有办法像 B=A(:,:,1) 一样分配,并且在不显式分配 B 的情况下保持 A 的边界?

4

2 回答 2

2

A(:,:,1)是一个表达式。它有 bounds (1:nx, 1:ny), BOTH 排名从 1 开始。它不是原始数组,它是一个新的表达式。

但是,即使它是一个具有其他下限的数组,自动分配总是从 1 开始分配索引。基本上,右手边又是一个表达式。

对于您的情况,您必须明确分配。

于 2020-02-01T08:39:46.397 回答
1

您可以使用:

allocate(B(lbound(A,1):ubound(A,1), lbound(A,2):ubound(A,2)))
于 2020-04-10T22:58:58.667 回答