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

如何在Fortran中构建可索引的嵌套字符串数组?

在Fortran中实现可变长度的嵌套字符数组

要实现Python中那种子数组长度可变的嵌套列表(如q = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h']]),Fortran的常规同构数组无法直接满足需求——因为常规数组要求所有元素类型、形状完全一致。你需要通过自定义派生类型来封装可变长度的子数组,具体实现如下:

方法:使用派生类型封装可分配字符数组

  1. 首先定义一个包含可分配字符数组的派生类型,用来存储单个子数组:
type :: CharSubarray
    character(len=1), allocatable :: items(:)  ! 可分配长度的字符数组
end type CharSubarray
  1. 声明该派生类型的数组,对应Python中的外层列表,并逐个初始化子数组:
program nested_char_arrays
    implicit none
    type(CharSubarray) :: q(3)  ! 外层数组包含3个自定义类型元素

    ! 初始化每个子数组
    q(1)%items = ['a', 'b', 'c']
    q(2)%items = ['d', 'e', 'f']
    q(3)%items = ['g', 'h']

    ! 测试索引访问
    print *, q(1)%items(1)  ! 输出 'a'
    print *, q(3)%items(2)  ! 输出 'h'
end program nested_char_arrays

为什么你的初始尝试失败?

你定义的character(1) :: letters(3)是一个存储单个字符的一维数组,每个元素只能容纳1个字符,无法存储数组类型的元素。Fortran的常规数组是同构的,所有元素必须是相同的基础类型(比如单个字符、整数),不能直接嵌套数组——这和Python的动态列表有本质区别,所以必须用派生类型来封装子数组。

补充:固定长度子数组的替代方案

如果你的子数组长度都相同,也可以直接使用二维字符数组:

character(1) :: q(3,3)  ! 3行3列的二维数组
q(1,:) = ['a', 'b', 'c']
q(2,:) = ['d', 'e', 'f']
q(3,:) = ['g', 'h', ' ']  ! 长度不足时用占位符填充

但这种方案不适用于子数组长度可变的场景,所以更推荐前面的派生类型方法。

内容的提问来源于stack exchange,提问作者Kajmunso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:53:38