在 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 读取到这是在较早的标准会议上提出的,但提出了一些我不记得很清楚的问题,我们将重新讨论。
从 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 读取到这是在较早的标准会议上提出的,但提出了一些我不记得很清楚的问题,我们将重新讨论。