在 Fortran 中读取带有名称列表的可分配字符串

Read an allocatable string with a namelist in Fortran

从 Fortran 2003 开始​​,可以使用可变长度的字符串。我不想以陈旧的方式工作并声明恒定的字符串长度,而是想动态读取我的名单中的字符串。

考虑该计划

program bug

  implicit none

  character(:), allocatable :: string
  integer :: file_unit

  namelist / list / string

  open(newunit=file_unit,file='namelist.txt')

  read(unit=file_unit,nml=list)
  write(*,*) string

  close(file_unit)

end program bug_namelist

以及包含在以下 namelist.txt 文件中的小名单:

&list
string = "abcdefghijkl"
/

如果我使用带有激进调试标志的 GCC 8.2.0 进行编译,我会得到

Warning: ‘.string’ may be used uninitialized in this function [-Wmaybe-uninitialized]

在运行时,没有打印任何东西,出现了:

Fortran runtime warning: Namelist object 'string' truncated on read.

使用具有类似调试标志的英特尔编译器 17.0.6,没有编译时标志和以下运行时错误:

forrtl: severe (408): fort: (7): Attempt to use pointer STRING when it is not associated with a target

这表明名单功能无法分配可变长度字符串 "by itself",因为如果我添加行

allocate(character(len=15) :: string)

错误消失。这是预期的行为吗?还是编译器的缺陷?

这是 Fortran 标准指定的预期行为。事实上,在 Fortran I/O 中,deferred-length 可分配字符串在任何地方都没有像在内部赋值中那样处理。下一个 Fortran 标准 ("F202X") 有一个提议的工作项目,以在有限的上下文中允许这样做(请参阅 https://j3-fortran.org/doc/year/18/18-279r1.txt)如果我没记错的话,我们讨论过添加 list-directed 和 NAMELIST 读取到这是在较早的标准会议上提出的,但提出了一些我不记得很清楚的问题,我们将重新讨论。