高级数组部分下标三元组和向量下标

如在另一示例中所提到的,可以引用阵列的元素的子集,称为阵列部分。从那个例子我们可能有

real x(10)
x(:)   = 0.
x(2:6) = 1.
x(3:4) = [3., 5.]

但是,数组部分可能比这更通用。它们可以采用下标三元组或向量下标的形式。

下标三胞胎

下标三元组采用 [bound1]:[bound2][:stride] 的形式。例如

real x(10)
x(1:10) = ...   ! Elements x(1), x(2), ..., x(10)
x(1:) = ...     ! The omitted second bound is equivalent to the upper, same as above
x(:10) = ...    ! The omitted first bound is equivalent to the lower, same as above
x(1:6:2) = ...  ! Elements x(1), x(3), x(5)
x(5:1) = ...    ! No elements: the lower bound is greater than the upper
x(5:1:-1) = ... ! Elements x(5), x(4), x(3), x(2), x(1)
x(::3) = ...    ! Elements x(1), x(4), x(7), x(10), assuming omitted bounds
x(::-3) = ...   ! No elements: the bounds are assumed with the first the lower, negative stride

当指定步幅(不能为零)时,元素序列以指定的第一个边界开始。如果步幅为正(相应为负),则序列后面的所选元素按步幅递增(分别递减),直到最后一个元素不大于第二个边界(相应小于)。如果省略步幅,则将其视为一个。

如果第一个边界大于第二个边界,并且步幅为正,则不指定任何元素。如果第一个边界小于第二个边界,并且步幅为负,则不指定任何元素。

应该注意的是,x(10:1:-1)x(1:10:1) 不同,即使 x 的每个元素都出现在两种情况下。

矢量下标

向量下标是秩 -1 整数数组。这指定了与数组值对应的元素序列。

real x(10)
integer i
x([1,6,4]) = ...     ! Elements x(1), x(6), x(4)
x([(i,i=2,4)]) = ... ! Elements x(2), x(3) and x(4)
print*, x([2,5,2])   ! Elements x(2), x(5) and x(2)

带有向量下标的数组部分受限于如何使用它:

  • 它可能不是与过程中定义的伪参数相关联的参数;
  • 它可能不是指针赋值语句中的目标;
  • 它可能不是数据传输语句中的内部文件。

此外,当选择相同的元素两次时,这样的数组部分可能不出现在涉及其定义的语句中。从上面:

print*, x([2,5,2])   ! Elements x(2), x(5) and x(2) are printed
x([2,5,2]) = 1.      ! Not permitted: x(2) appears twice in this definition

更高等级的阵列部分

real x(5,2)
print*, x(::2,2:1:-1)  ! Elements x(1,2), x(3,2), x(5,2), x(1,1), x(3,1), x(5,1)