整個陣列陣列元素和陣列部分

考慮宣告為的陣列

real x(10)

然後我們有三個方面的興趣:

  1. 整個陣列 x;
  2. 陣列元素,如 x(1);
  3. 陣列部分,如 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