能否用隐式DO循环配合格式化WRITE初始化Fortran字符数组?
用隐式DO循环结合格式化构造初始化Fortran字符数组
当然可以实现这种批量初始化的需求,不过Fortran没法直接在数组初始化的等号右侧使用WRITE语句,我们可以通过内部文件结合隐式DO循环的方式达成目标,下面是两种实用的实现方案:
方案一:运行时循环初始化
这是最直接的写法,在数组声明后通过循环逐个写入格式化后的字符串:
character(len=8), dimension(5) :: names integer :: i do i = 1, 5 ! 利用内部文件将格式化内容写入数组元素 write(names(i), '(A,I4.4)') 'ens_', i end do
方案二:声明时通过数组构造器+自定义函数初始化
如果想在数组声明的同时完成初始化(类似你期望的隐式DO构造写法),可以借助自定义函数配合数组构造器的隐式DO循环:
! 先定义一个生成指定格式字符串的函数 function get_ens_name(idx) result(name) integer, intent(in) :: idx character(len=8) :: name write(name, '(A,I4.4)') 'ens_', idx end function get_ens_name ! 声明数组时直接用数组构造器调用函数 character(len=8), dimension(5) :: names = [ (get_ens_name(i), i=1,5) ]
关键注意事项
- 格式化字符串
(A,I4.4)要严格匹配字符数组的长度:'ens_'占4个字符,I4.4确保数字占4位(不足补前导零),加起来正好8位,避免出现字符串截断或不必要的空格填充。 - 数组构造器的语法
[ (func(i), i=1,5) ]是Fortran 2003及以上标准支持的,旧标准可以替换为(/ (func(i), i=1,5) /)。
内容的提问来源于stack exchange,提问作者guezo
相关产品推荐
相关产品推荐

