由于 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)
错误消失。这是预期的行为吗?还是编译器的缺陷?