名单中的科学记数法与gfortran

时间:2014-11-03 10:58:15

标签: fortran gfortran

我想通过名单从输入文件加载一个列表。要编译,我使用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的名单中使用科学记数法?

2 个答案:

答案 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