2017-06-12 36 views
1

我的程序需要用戶對某些變量進行標準輸入。默認值用於用戶只需按下標準輸入中的輸入

subroutine stdInp(maxStep,gam,tolL) 

integer,intent(inout) :: maxStep 
real(dp),intent(inout) :: gam 
real(dp),intent(inout) :: tolL 

character :: tmpI 

write(*,*) "Max number of iterations?: " 
read(*,*) maxStep 

if (maxStep .le. 0) then 
    write(*,*) "Invalid number of iterations!" 
    stop 
end if 

(...) 

當程序用戶需要輸入數值時,只需按下ENTER鍵,我想使用默認值。

我發現了類似的搜索問題,但它們不適用於Fortran。

如何讓Fortran代碼對ENTER做出反應?

回答

0

先讀一個字符串。然後檢查它是否包含有效的數字。

character(256) :: line 

write(*,*) "Max number of iterations?: " 
read(*,'(a)') line 

if (len_trim(line)==0) then 
    maxStep = default_value 
else 
    read(line, *, iostat = ierr) maxStep 

    if (ierr/=0) stop !or default 
end if 
+0

好主意,雖然我會檢查一個空字符串採取默認值。錯字的號碼不應該導致默認值。你也可以把它放在一個循環中來重新提示另一個條目從錯誤中恢復。 – Jack

+0

嗯,當然,但這是在OP上,而不是在我設置確切的條件。如果您查看原始代碼,他會檢查負數並停止。他也可以在那裏留下這張支票。基本上,這不是一個代碼編寫服務,所以解決方案通常不會完成最終的工作代碼。 –

+0

我其實本來想檢查*只*爲空字符串。但是這會導致無效數字未被選中。他們是否應該離開崩潰或默認,這是由OP決定的。 –

0

您有一個答案,它給出了在輸入無效的情況下應用默認值的方法。在這個答案中,我會解釋爲什麼按下回車似乎什麼都不做。

隨着列表定向輸入

read(*,*) maxStep 

按下而沒有任何其他值輸入簡單地結束該第一輸入記錄。但是,使用這種輸入方式,它實際上並沒有從輸入語句中返回執行:它僅被視爲空白(就像輸入了空格)。輸入語句仍然等待一個值。

通過使用明確的格式(此處爲'(A)'),讀入字符串的答案將避免列表引導的輸入。這當然是可行的。另一種方法是使用一個特定的整數格式

read(*,'(I10)') maxStep 

如果連接的焊盤模式是'YES'然後按壓輸入結束輸入記錄裝置的輸入字段是所有毛坯,然後將其解釋爲設置值歸零。

use, intrinsic :: iso_fortran_env, only : input_unit 
open(unit=input_unit, pad='YES') 
read(*,'(I10)') maxStep 
if (maxStep.eq.0) maxStep=default_maxStep 

[最初的這兩條線也有可能不是必要的:在手柄模式默認爲'YES']

此方法還避免了使用iostat=如果你很高興留下錯誤被終止處理。如果您願意,您當然可以使用iostat=

+0

這真的很有幫助。我想我更深入地理解格式規範如何在IO語句上工作。 – Patche