Fortran如何定义第二维长度随第一维下标变化的不规则数组?
Fortran不规则长度二维数组实现方案
Fortran原生不支持直接定义每行长度不一致的二维数组,原生数组的所有维度长度在定义时(或动态分配后)对所有元素统一,无法为不同下标的第一维元素分配不同的第二维长度。你可以通过以下两种常用方案实现需求:
- 方案1:使用嵌套可分配数组的派生类型
这是最常用的实现方式,语法清晰且灵活度高:
program jagged_arr_demo implicit none ! 先定义承载一维可分配数组的派生类型 type :: int_arr_1d integer, allocatable :: elem(:) end type int_arr_1d ! 第一维长度固定为2的派生类型数组 type(int_arr_1d) :: A(2) ! 为不同第一维下标分配不同长度的第二维 allocate(A(1)%elem(3)) allocate(A(2)%elem(6)) ! 赋值示例 A(1)%elem = [1,2,3] A(2)%elem = [4,5,6,7,8,9] ! 读取示例:输出a=2的第5个元素 print *, A(2)%elem(5) ! 释放内存(可选,程序结束会自动释放) deallocate(A(1)%elem, A(2)%elem) end program jagged_arr_demo
- 方案2:一维扁平数组+索引映射
如果需要内存连续的存储结构提升遍历性能,可以选择该方案:
program flat_arr_demo implicit none integer, parameter :: total_elem = 9 ! 所有元素存在一维数组中 integer :: A(total_elem) ! 分别存储每行的起始下标和长度 integer, parameter :: row_start(2) = [1, 4] integer, parameter :: row_len(2) = [3, 6] ! 赋值示例 A(row_start(1) : row_start(1)+row_len(1)-1) = [1,2,3] A(row_start(2) : row_start(2)+row_len(2)-1) = [4,5,6,7,8,9] ! 读取示例:输出a=1的第2个元素 print *, A(row_start(1)+1) end program flat_arr_demo
内容的提问来源于stack exchange,提问作者AlphaF20
相关产品推荐
相关产品推荐

