整個陣列陣列元素和陣列部分
考慮宣告為的陣列
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