You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 20:24:08