数组构造函数

可以使用数组构造函数使用语法创建 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)