我想通过名单从输入文件加载一个列表。要编译,我使用gfortran:
PROGRAM main
IMPLICIT NONE
INTEGER :: val,err
NAMELIST /myNamelist/ val
OPEN(100,file='input.txt')
READ(unit=100,nml=myNamelist,iostat=err)
CLOSE(100)
PRINT *, val
END PROGRAM
input.txt如下所示:
&myNamelist
val = 3e3
/
程序打印0而不是3000.如果我在输入文件中插入val = 3000,它就可以工作。似乎gfortran不支持名单中的科学记数法。但是ifort运行正常。是否有一种解决方法或某些东西在gfortran的名单中使用科学记数法?
答案 0 :(得分:4)
您使用iostat=err
,但不检查err
的值!如果您这样做,您会发现错误情况发生且err
非零。因此,val
没有用处。
科学记数法对整数输入无效。阅读real
变量或不使用科学记数法。
尝试:
PROGRAM main
IMPLICIT NONE
INTEGER :: val,err
character(256) :: msg
NAMELIST /myNamelist/ val
OPEN(100,file='input.txt')
READ(unit=100,nml=myNamelist,iostat=err,iomsg=msg)
CLOSE(100)
PRINT *, err
PRINT *, msg
print *, val
END PROGRAM
运行:
> sunf90 intnml.f90
> ./a.out
1083
unexpected character in integer value
0
BTW,英特尔Fortran接受该值,但这是一个非标准扩展。如果您依赖它,您的程序将是不可移植的。
答案 1 :(得分:3)
我必须提交的2008年标准草案,在第10.11.3.3.6段中,在阅读名单的背景下:
当下一个有效项为integer类型时,输入中的值 记录被解释为具有合适的Iw编辑描述符 使用w的值。
在这种情况下,gfortran
的标准要求不超过标准要求,而英特尔编译器会更进一步,并实现一个扩展,以应对非标准形式的整数值, ie 3e3
。