2014-02-27 101 views
0

我已經把錯誤檢查在輸入作出:檢查輸入型再現聲明

integer :: lsp 
chksp:do 
write(*,*) "#Enter Number" 
read(*,*,iostat=istat)lsp 
if (istat==0) then 
    exit chksp 
else 
    write(*,*)"Number can only be integer. Re-enter!" 
end if 
end do chksp 

的問題是,它可以檢測錯誤,如果在enteres一個字符值,而不是一個數值, ;但如果輸入實際值而不是整數,則無法檢測到錯誤。

有什麼辦法強制它只檢測整數?

注意:可能是ifort的問題; gfortran對代碼感到滿意。

+0

它適用於我並打印「數字只能是整數。重新輸入!」當我輸入浮點值。 –

+0

好的,不適用於ifort。 –

+2

問題在於程序員的期望,而不是ifort。 ifort接受的輸入不是標準所說的那樣,這非常好。它將允許任何數字輸入的數字列表項。不要使用列表導向的輸入進行驗證 - 實現可能比您想要的更加自由。 –

回答

4

可以指定格式,請求一個整數:

program enter_int 
    implicit none 
    integer  :: ierror, intVal 

    do 
    write(*,*) "Enter an integer number" 
    read(*,'(i10)',iostat=ierror) intval 

    if (ierror == 0) then 
     exit 
    endif 
    write(*,*) 'An error occured - please try again' 

    enddo 

    write(*,*) 'I got: ', intVal 
end program 

然後,提供一浮動失敗。

+0

它與問題代碼有什麼不同? –

+0

'read'語句有一個格式說明符。 –

+0

是的,我明白了,沒有描述就忽略了。 –

1

像下面這樣的東西?

[email protected]:~/test/stackoverflow$ cat read.f90 
Program readit 

    Integer :: val 
    Integer :: iostat 

    val = -9999 

    Do 

    Read(*, '(i20)', iostat = iostat) val 

    If(iostat == 0) Then 
     Write(*, *) 'val = ', val 
    Else 
     Write(*, *) 'oh dear!!' 
    End If 

    End Do 

End Program readit 
[email protected]:~/test/stackoverflow$ nagfor -o read read.f90 
NAG Fortran Compiler Release 5.3.1(907) 
[NAG Fortran Compiler normal termination] 
[email protected]:~/test/stackoverflow$ ./read 
10 
val = 10 
10.0 
oh dear!! 
safs 
oh dear!! 
123dfs23 
oh dear!! 
^C 
[email protected]:~/test/stackoverflow$ gfortran -o read read.f90 
[email protected]:~/test/stackoverflow$ ./read 
10 
val =   10 
10.0 
oh dear!! 
dsfs 
oh dear!! 
^C 
[email protected]:~/test/stackoverflow$