这是测试代码:
program testcase
implicit none
integer :: ios, lu
type derived
integer :: a
end type derived
type (derived) :: d
namelist /test/ d
lu = 3
open (lu, file = 'test.dat', status='old', iostat=ios)
read (lu, nml = test, iostat=ios)
if (ios /= 0) then
write (*, *) 'error!'
else
write (*, *) 'good!', d % a
endif
end program testcase
此程序读取输入文件test.dat
,其中包含test
的名称列表,其类型为派生类型derived
。
当我尝试test.dat
的下一个内容时,它工作正常(打印good! 7
):
&test
d%a = 7
/
但是,对于下一个内容,我收到错误:
&test
d % a = 7
/
Equal sign must follow namelist object name d
在派生类型中,组件访问的%
符号周围的空格有什么不同。
我已经使用GNU Fortran(gfortran)5.3.0进行了测试。我也从同事那里听说最新的英特尔Fortran编译器出现了同样的问题。他还坚持认为旧版本的英特尔Fortran编译器在两种情况下都能正常工作。
这种行为是否正常?也就是说,标准是否禁止名单列表输入文件中%
周围的空格,而源代码中允许%
周围的空格?
或者,这是编译器或标准库实现的错误吗?
答案 0 :(得分:1)
最后,我找到了一些提到这个问题的参考文献。
来自http://technion.ac.il/doc/intel/compiler_f/main_for/lref_for/source_files/pghnminp.htm,
& group-name object = value [,object = value] ... /
...
对象
是否在中定义了实体的名称(或子对象指示符) NAMELIST声明组名。 对象名称不得 包含嵌入的空格,但在下标的括号内除外 或子字符串说明符。每个对象必须包含在一个对象中 记录。
来自http://docs.cray.com/books/S-3693-51/html-S-3693-51/i5lylchri.html的另一个,
显然,似乎永远不允许名字中的空格。2.13.1.1。名称 - 值对中的名称
...
- 输入记录中的名称不得包含嵌入的空格。名称 - 值对中的名称可以在一个或多个之前或之后 空白。