如何向可分配字符变量写入内容?Fortran日志子程序疑问
Fortran 可分配字符变量自动分配写入问题
我编写了一个日志功能的Fortran子程序,它接收一个必填字符串参数,以及两个可选的待格式化参数。以下是简化版本,目前向action_local写入内容时失败:
subroutine log(required_param, action, idx) character(len=*), intent(in) :: required_param character(len=*), intent(in), optional :: action integer, intent(in), optional :: idx character(:), allocatable :: action_local 10 format(A, A, I) if (present(action) .and. present(idx)) then write(action_local, 10) ' ', action, idx ! fails: action_local is not allocated else action_local = '' end if print *, required_param // action_local end subroutine
我希望无需预估所需大小,让写入语句自动分配所需空间,请问是否有办法无需提前分配就向可分配character变量写入内容?
解决方案
Fortran 2003及后续标准支持向未分配的可分配字符变量直接执行内部写入,编译器会自动计算输出内容的长度并完成空间分配。只需满足两个前提:
- 使用支持Fortran 2003+的编译器(如GCC gfortran、Intel Fortran等主流编译器均支持)
- 确保格式化规则合理,避免固定宽度带来的冗余或截断问题
修改后的代码示例:
subroutine log(required_param, action, idx) character(len=*), intent(in) :: required_param character(len=*), intent(in), optional :: action integer, intent(in), optional :: idx character(:), allocatable :: action_local if (present(action) .and. present(idx)) then ! 自动分配空间并写入格式化内容 write(action_local, '(A, A, I0)') ' ', action, idx else action_local = '' end if print *, required_param // action_local end subroutine
关键说明
- 用
I0替代原格式中的I:I0会根据整数的实际位数自动调整输出宽度,避免固定宽度导致的空间浪费或内容截断。 - 执行
write(action_local, ...)时,编译器会自动计算格式化后字符串的长度,为action_local分配恰好足够的内存。 - 若编译器默认未启用高版本Fortran标准,需手动指定编译选项,例如gfortran使用
-std=f2003或-std=f2018。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

