2017-06-12 83 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