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