我想通过名单从输入文件加载列表。为了编译,我使用 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
Run Code Online (Sandbox Code Playgroud)
input.txt 如下所示:
&myNamelist
val = 3e3
/
Run Code Online (Sandbox Code Playgroud)
该程序打印 0 而不是 3000。如果我在输入文件中插入 val = 3000,它就会起作用。看来 gfortran 不支持名单中的科学记数法。然而,使用 ifort 则运行良好。是否有解决方法或在 gfortran 的名单中使用科学记数法的方法?
你使用了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
Run Code Online (Sandbox Code Playgroud)
跑步:
> sunf90 intnml.f90
> ./a.out
1083
unexpected character in integer value
0
Run Code Online (Sandbox Code Playgroud)
顺便说一句,Intel Fortran 接受该值,但这是一个非标准扩展。如果你依赖它,你的程序将是不可移植的。