整个数组数组元素和数组部分

考虑声明为的数组

real x(10)

然后我们有三个方面的兴趣:

  1. 整个阵列 x;
  2. 数组元素,如 x(1);
  3. 数组部分,如 x(2:6)

整个阵列

在大多数情况下,整个数组 x 将数组的所有元素称为单个实体。它可能出现在可执行语句中,例如 print *, SUM(x)print *, SIZE(x)x=1

整个数组可以引用未明确定形的数组(例如上面的 x):

function f(y)
  real, intent(out) :: y(:)
  real, allocatable::z(:)

  y = 1.         ! Intrinsic assignment for the whole array
  z = [1., 2.,]  ! Intrinsic assignment for the whole array, invoking allocation
end function

假设大小的数组也可能显示为整个数组,但仅限于有限的情况(在别处记录)。

数组元素

数组元素被称为给出整数索引,每个数组对应一个数组,表示整个数组中的位置:

real x(5,2)
x(1,1) = 0.2
x(2,4) = 0.3

数组元素是标量。

数组部分

数组部分是使用涉及冒号的语法对整个数组的多个元素(可能只是一个)的引用:

real x(5,2)
x(:,1) = 0.         ! Referring to x(1,1), x(2,1), x(3,1), x(4,1) and x(5,1)
x(2,:) = 0.         ! Referring to x(2,1), x(2,2)
x(2:4,1) = 0.       ! Referring to x(2,1), x(3,1) and x(4,1)
x(2:3,1:2) = 0.     ! Referring to x(2,1), x(3,1), x(2,2) and x(3,2)
x(1:1,1) = 0.       ! Referring to x(1,1)
x([1,3,5],2) = 0.   ! Referring to x(1,2), x(3,2) and x(5,2)

上面的最终形式使用向量下标 。除了其他数组部分之外,这还受到许多限制。

每个数组部分本身就是一个数组,即使只引用了一个元素。那是 x(1:1,1) 是排名 1 的数组,x(1:1,1:1) 是排名 2 的数组。

数组部分通常不具有整个数组的属性。特别是在哪里

real, allocatable::x(:)
x = [1,2,3]     ! x is allocated as part of the assignment
x = [1,2,3,4]   ! x is dealloacted then allocated to a new shape in the assignment

分配

x(:) = [1,2,3,4,5]   ! This is bad when x isn't the same shape as the right-hand side

不允许:x(:),虽然包含 x 所有元素的数组部分不是可分配的数组。

x(:) = [5,6,7,8]

x 是右手边的形状时很好。

数组的数组组件

type t
   real y(5)
end type t

type(t) x(2)

我们也可以在更复杂的设置中引用整个数组,数组元素和数组部分。

从上面可以看出,x 是一个完整的阵列。我们还有

x(1)%y        ! A whole array
x(1)%y(1)     ! An array element
x%y(1)        ! An array section
x(1)%y(:)     ! An array section
x([1,2]%y(1)  ! An array section
x(1)%y(1:1)   ! An array section

在这种情况下,我们不允许有一个以上由一个等级 1 组成的引用的一部分。例如,不允许以下内容

x%y             ! Both the x and y parts are arrays
x(1:1)%y(1:1)   ! Recall that each part is still an array section