高階陣列部分下標三元組和向量下標
如在另一示例中所提到的,可以引用陣列的元素的子集,稱為陣列部分。從那個例子我們可能有
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)