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

时间:2018-11-21 19:19:16

标签: fortran

示例代码如下:

num_children

输入文件CREATE TABLE `history_uids` ( `uid` int(10) NOT NULL, `active` tinyint(1) NOT NULL DEFAULT '1' ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `history_uids` (`uid`, `active`) VALUES (1, 1), (2, 0), (3, 0), (4, 0), (5, 0), (6, 0); CREATE TABLE `options` ( `id` int(10) NOT NULL, `id_parent` int(10) DEFAULT NULL, `text` varchar(255) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `options` (`id`, `id_parent`, `text`) VALUES (1, NULL, 'parent active'), (2, 1, 'child 1 inactive'), (3, 1, 'child 2 inactive'), (4, 1, 'child 3 inactive'), (5, 1, 'child 4 inactive'), (6, 1, 'child 5 inactive'); ALTER TABLE `history_uids` ADD PRIMARY KEY (`uid`); ALTER TABLE `options` ADD PRIMARY KEY (`id`), ADD KEY `id_parent` (`id_parent`); ALTER TABLE `options` ADD CONSTRAINT `ibfk_3` FOREIGN KEY (`id_parent`) REFERENCES `options` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, ADD CONSTRAINT `ibfk_4` FOREIGN KEY (`id`) REFERENCES `history_uids` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE; 包含:

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 / 编译的代码不会发出警告/错误。我想知道是否有编译器选项可用于在遇到这种情况时引发错误/警告?

1 个答案:

答案 0 :(得分:4)

我不知道gfortran(或任何其他Fortran编译器)有这样的选项。我也强烈建议您在找到该选项时不要依赖此选项。

存在名称列表格式,以使对特定对象的输入具有某种简单性和灵活性。希望将名称列表中的警告读为不更新所有变量,这可能是试图不当使用该工具。

对于程序和问题的输入,预期的运行时行为是使用所声明的值定义ab,而未定义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* /