2014-11-03 32 views
2

我想通過名稱列表從輸入文件加載列表。要編譯,我使用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的名單中使用科學記數法?

回答

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接受的價值,但這是一個非標準擴展。如果你依賴那個,你的程序將不可移植。

3

2008年標準的草案,我不得不手工狀態,在第10.11.3.3.6,在讀名單的情況下:

當下一個有效的產品類型爲整數時,輸入 記錄中的值被解釋爲具有使用w值的合適 值的Iw編輯描述符。

在這種情況下gfortran是做不超過該標準要求而Intel編譯進一個比特進一步並實現與非標準形式的整數值的科佩斯的延伸,即3e3

+1

這是一個擴展。被允許。我們允許任何數字類型輸入到列表定向或名稱列表輸入中的任何其他數字類型。 gfortran和ifort都是正確的。這裏的輸入是非標準的,所以任何解釋都是允許的。 – 2014-11-03 21:48:10

+0

現在回答修改以刪除英特爾編譯器上的aspersion。 – 2014-11-04 06:05:18