高階陣列部分下標三元組和向量下標

如在另一示例中所提到的,可以引用陣列的元素的子集,稱為陣列部分。從那個例子我們可能有

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)