陣列建構函式

可以使用陣列建構函式使用語法建立 rank-1 陣列值

(/ ... /)
[ ... ]

形式 [...] 是在 Fortran 2003 中引入的,通常被認為更清晰,特別是在複雜的表示式中。此表單僅用於此示例。

陣列建構函式中的值可以是標量值,陣列值或隱含 do 迴圈。

構造的陣列的型別和型別引數與陣列建構函式中的值匹配

[1, 2, 3]      ! A rank-1 length-3 array of default integer type
[1., 2., 3.]   ! A rank-1 length-3 array of default real type
["A", "B"]     ! A rank-1 length-2 array of default character type

integer, parameter::A = [2, 4]
[1, A, 3]      ! A rank-1 length-4 array of default integer type, with A's elements

integer i
[1, (i, i=2, 5), 6]  ! A rank-1 length-6 array of default integer type with an implied-do

在上面的表格中,給出的所有值必須是相同的型別和型別引數。不允許混合型別或型別引數。以下示例無效

[1, 2.]      ! INVALID: Mixing integer and default real
[1e0, 2d0]   ! INVALID: Mixing default real and double precision
[1., 2._dp]  ! INVALID: Allowed only if kind `dp` corresponds to default real
["Hello", "Frederick"]  ! INVALID: Different length parameters

要使用不同型別構造陣列,應給出陣列的型別規範

[integer :: 1, 2., 3d0]    ! A default integer array
[real(dp) :: 1, 2, 3._sp]  ! A real(dp) array
[character(len=9) :: "Hello", "Frederick"]  ! A length-2 array of length-9 characters

後一種形式的字元陣列特別方便避免空間填充,例如替代

["Hello    ", "Frederick"]  ! A length-2 array of length-9 characters

名為 constant 的陣列的大小可以由用於設定其值的陣列建構函式隱含

integer, parameter::ids(*) = [1, 2, 3, 4]

對於長度引數化型別,可以假設長度引數

character(len=*), parameter::names(*) = [character(3) :: "Me", "You", "Her"]

在零長度陣列的構造中也需要型別規範。從

[ ] ! Not a valid array constructor

無法從不存在的值集確定型別和型別引數。要建立零長度預設整數陣列:

[integer :: ]

陣列建構函式僅構造 rank-1 陣列。有時,例如在設定命名常量的值時,表示式中也需要更高階別的陣列。可以從具有構造的秩 -1 陣列的 reshape 的結果中獲取更高秩的陣列

integer, parameter::multi_rank_ids(2,2) = RESHAPE([1,2,3,4], shape=[2,2])

在陣列建構函式中,陣列的值按元素順序與值列表中的任何陣列一樣,就好像各個元素以陣列元素順序自己給出。因此,前面的例子

integer, parameter::A = [2, 4]
[1, A, 3]      ! A rank-1 length-4 array of default integer type, with A's elements

相當於

[1, 2, 4, 3]   ! With the array written out in array element order

通常,建構函式中的值可以是任意表示式,包括巢狀陣列建構函式。對於這樣的陣列建構函式來滿足某些條件,例如作為常量或規範表示式,限制適用於組成值。

雖然不是陣列建構函式,但也可以使用 spread 內部函式方便地建立某些陣列值。例如

[(0, i=1,10)]  ! An array with 10 default integers each of value 0

也是函式引用的結果

SPREAD(0, 1, 10)