Начиная с 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)
, ошибки исчезнут.Это ожидаемое поведение?Или это дефект от компиляторов?