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

时间:2018-10-28 19:09:37

标签: string fortran character allocatable-array

从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.

以及具有类似调试标志,没有编译时标志和以下运行时错误的Intel编译器17.0.6:

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

表示名称列表功能无法“自行”分配变长字符串,因为如果我添加该行

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

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

1 个答案:

答案 0 :(得分:6)

这是预期的行为,由Fortran标准指定。实际上,在Fortran I / O中,没有任何方法可以像处理内部分配那样处理可延期分配的字符串。对于下一个Fortran标准(“ F202X”),存在一个建议的工作项目,以允许在有限的上下文中使用该工作项目(请参阅https://j3-fortran.org/doc/year/18/18-279r1.txt)。如果我没记错的话,我们在前面讨论过添加列表定向和NAMELIST读取的问题。标准会议,但提出了一些我不记得的问题,我们将再次讨论。