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)
エラーが消えます。これは予想される動作ですか?それともコンパイラの欠陥ですか?