【问题标题】:Read an allocatable string with a namelist in Fortran在 Fortran 中读取带有名称列表的可分配字符串
【发布时间】:2018-10-29 03:25:57
【问题描述】:

自 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

这表明名称列表功能无法“自行”分配可变长度字符串,因为如果我添加该行

allocate(character(len=15) :: string)

错误消失。这是预期的行为吗?还是编译器的缺陷?

【问题讨论】:

    标签: string fortran character allocatable-array


    【解决方案1】:

    这是预期行为,由 Fortran 标准指定。事实上,在 Fortran I/O 中,没有任何地方可以像在内部赋值中那样对待延迟长度的可分配字符串。有一个针对下一个 Fortran 标准(“F202X”)的建议工作项,以允许在有限的上下文中执行此操作(请参阅https://j3-fortran.org/doc/year/18/18-279r1.txt) ,但提出了一些我记不太清的问题,我们将重新讨论。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-24
      • 1970-01-01
      • 2018-11-18
      • 1970-01-01
      • 1970-01-01
      • 2020-03-24
      • 2023-01-15
      相关资源
      最近更新 更多