正如你建议的那样answer https://stackoverflow.com/a/18316726/3157076另一个问题,看看参差不齐的数组可能是您想要的,我将简要提及该答案的可用性扩展(Doug Lipinski 在评论中暗示)。
对于基本类型,表示可变长度维度,由 High Performance Mark 给出
type :: vector
integer, dimension(:), allocatable :: elements
end type vector
以及这些数组的类型
type :: ragged_array
type(vector), dimension(:), allocatable :: vectors
end type ragged_array
一个有分配步骤
type(ragged_array) :: ragarr
allocate(ragarr%vectors(5))
allocate(ragarr%vectors(1)%elements(3))
! etc.
[或者,人们可能会想要拥有一系列type(vector)
.]
对于可用性方面,可以创建一个结构构造函数来执行大量分配,甚至依赖于可变长度组件的自动分配。
在后一种情况下,如果在创建时知道值(而不仅仅是范围),则这是有意义的。
allocate(ragarr%vectors(5))
ragarr%vectors(1)%elements = [1, 6, 13]
! etc.
对于前一种情况,类似
module ragged
implicit none
type :: vector
integer, dimension(:), allocatable :: elements
end type vector
type :: ragged_array
type(vector), dimension(:), allocatable :: vectors
end type ragged_array
interface ragged_array
module procedure ragged_constructor
end interface ragged_array
contains
function ragged_constructor(sizes) result(ra)
integer, intent(in) :: sizes(:)
type(ragged_array) ra
integer i
allocate(ra%vectors(SIZE(sizes)))
do i=1,SIZE(sizes)
allocate(ra%vectors(i)%elements(sizes(i)))
end do
end function ragged_constructor
end module ragged
program test
use ragged
implicit none
type(ragged_array) :: ra
ra = ragged_array([3,4,6,1,12])
end program