4

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)

エラーが消えます。これは予想される動作ですか?それともコンパイラの欠陥ですか?

4

1 に答える 1