整个数组数组元素和数组部分
考虑声明为的数组
real x(10)
然后我们有三个方面的兴趣:
- 整个阵列
x
; - 数组元素,如
x(1)
; - 数组部分,如
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