如何在Fortran中构建可索引的嵌套字符串数组?
在Fortran中实现可变长度的嵌套字符数组
要实现Python中那种子数组长度可变的嵌套列表(如q = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h']]),Fortran的常规同构数组无法直接满足需求——因为常规数组要求所有元素类型、形状完全一致。你需要通过自定义派生类型来封装可变长度的子数组,具体实现如下:
方法:使用派生类型封装可分配字符数组
- 首先定义一个包含可分配字符数组的派生类型,用来存储单个子数组:
type :: CharSubarray character(len=1), allocatable :: items(:) ! 可分配长度的字符数组 end type CharSubarray
- 声明该派生类型的数组,对应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
相关产品推荐
相关产品推荐

