Fortran 当输入名称列表文件中缺少名称列表变量时,如何引发运行时错误?

Fortran 当输入名称列表文件中缺少名称列表变量时,如何引发运行时错误?,fortran,Fortran,示例代码如下所示: program main implicit none integer :: ufile real :: a, b, c namelist /my_nlt/ a, b, c open(newunit=ufile,file='my_nlt.txt') read(ufile,my_nlt) close(ufile) write(*,my_nlt) end program main 输入文件my_nlt.txt包含: &my_nlt a=1.0 b=2

示例代码如下所示:

program main
 implicit none
 integer :: ufile
 real :: a, b, c
 namelist /my_nlt/ a, b, c
 open(newunit=ufile,file='my_nlt.txt')
 read(ufile,my_nlt)
 close(ufile)
 write(*,my_nlt)
end program main
输入文件my_nlt.txt包含:

 &my_nlt
 a=1.0
 b=2.0
  /
这里输入文件中缺少变量c。
运行gfortran编译的代码不会发出警告/错误。我想知道在遇到这种情况时,是否有一个编译器选项可用于发出错误/警告?

我不知道gfortran或任何其他Fortran编译器有这样的选项。我还强烈建议,如果找到这样一种选择,就不要依赖这种选择

名称列表格式的存在为特定对象的输入提供了一定的简单性和灵活性。想要通过名称列表读取警告而不更新所有变量,可能是试图不恰当地使用该工具

对于问题的程序和输入,预期的运行时行为是使用所述值定义a和b,而未定义c。相反,我们可以在读取之前用一个值定义三个变量,并查看它们是否被读取更新:

real, parameter :: SENTINEL=HUGE(0.)
real :: a=SENTINEL, b=SENTINEL, c=SENTINEL
namelist /my_nlt/ a, b, c
open(newunit=ufile,file='my_nlt.txt')
read(ufile,my_nlt)

if (a==SENTINEL.or.b==SENTINEL.or.c==SENTINEL) ERROR STOP
在这里,SENTINEL是变量不需要的值或输入中意外的值。名称列表记录中未包含的变量在读取之前保留其值

这与当然不会出现的情况不同,特别是在没有超出范围的输入值的情况下,但如果要检查,则必须手动解析输入文件。这种名称列表文件的结构定义良好

最后,变量c是否存在于以下名称列表输入记录中

&my_nlt a=1., b=2., c=1* /

除了@francescalus的优秀答案之外,在未命名变量的情况下读取的名称列表会使该变量保持其先前的定义状态。我要注意的是,你甚至不能依靠编译器的未初始化变量检查来检测这一点。如果输入文件看起来像&my_nlt a=1.0,b=2.0,c=2+1/,c仍然会得到一个使用gfortran测试没有错误的值,但该值不是我们所期望的。为了测试变量是否出现,可能最安全的方法是手动解析输入文件。@YoujunHu,我关于不适当使用该工具的评论涉及到名称列表输入如何设计为不影响变量,而这些变量在输入记录中不起作用,并且可能以任何顺序或不完整的方式出现,这与其他形式的格式化输入形成了鲜明的对比。可以将其视为一个类似于命令行参数的工具:用户希望能够在命令行上仅给出一个值的选择,可能会将其他值作为默认值或未指定。@YoujunHu,c在名称列表记录中有一个定义良好的值&my_nlt a=1.0,b=2.0,c=2+1/。这个值是20。。[如果你不明白为什么,那可能是个好问题。]@YoujunHu,这是20,因为2+1作为输入字段被解释为指数为12×10^1的2。