Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Io 当用户只需在标准输入中按enter键时,将使用默认值_Io_Fortran - Fatal编程技术网

Io 当用户只需在标准输入中按enter键时,将使用默认值

Io 当用户只需在标准输入中按enter键时,将使用默认值,io,fortran,Io,Fortran,我的程序需要用户对某些变量进行标准输入 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

我的程序需要用户对某些变量进行标准输入

 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代码对输入做出反应?

首先读取字符串。然后检查它是否包含有效数字

 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

先读一个字符串。然后检查它是否包含有效数字

 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

您有一个答案,它给出了在输入无效的情况下应用默认值的方法。在这个答案中,我将解释为什么按enter键似乎什么都不做

使用列表定向输入

read(*,*) maxStep
在没有任何其他值的情况下按enter键只会结束第一条输入记录。然而,使用这种类型的输入,它实际上不会从input语句返回执行:它只被视为空白(就像输入了空格一样)。input语句仍在等待值

您将看到,读入字符串的答案通过使用显式格式(此处
(a)
)避免了列表定向输入。这当然是可行的。另一种方法是使用特定于整数的格式

read(*,'(I10)') maxStep
如果连接的pad模式为“是”,则按enter键结束输入记录意味着输入字段全部为空白,然后解释为将值设置为零

use, intrinsic :: iso_fortran_env, only : input_unit
open(unit=input_unit, pad='YES')
read(*,'(I10)') maxStep
if (maxStep.eq.0) maxStep=default_maxStep
[前两行可能不是必需的:pad模式的默认值为
'YES'
]


如果您愿意将错误留给终止来处理,则此方法还可以避免使用
iostat=
。如果愿意,您当然可以使用
iostat=

您有一个答案,它给出了在输入无效的情况下应用默认值的方法。在这个答案中,我将解释为什么按enter键似乎什么都不做

使用列表定向输入

read(*,*) maxStep
在没有任何其他值的情况下按enter键只会结束第一条输入记录。然而,使用这种类型的输入,它实际上不会从input语句返回执行:它只被视为空白(就像输入了空格一样)。input语句仍在等待值

您将看到,读入字符串的答案通过使用显式格式(此处
(a)
)避免了列表定向输入。这当然是可行的。另一种方法是使用特定于整数的格式

read(*,'(I10)') maxStep
如果连接的pad模式为“是”,则按enter键结束输入记录意味着输入字段全部为空白,然后解释为将值设置为零

use, intrinsic :: iso_fortran_env, only : input_unit
open(unit=input_unit, pad='YES')
read(*,'(I10)') maxStep
if (maxStep.eq.0) maxStep=default_maxStep
[前两行可能不是必需的:pad模式的默认值为
'YES'
]


如果您愿意将错误留给终止来处理,则此方法还可以避免使用
iostat=
。如果您愿意,当然可以使用
iostat=

好主意,不过我会检查是否有空字符串作为默认值。键入错误的数字不应导致默认值。你也可以把它放在一个循环中,重新编译另一个条目以从错误中恢复。好吧,当然,但这是在OP上,而不是在我身上设置确切的条件。如果你查看原始代码,他会检查负数并停止。他也可以把这张支票留在那里。基本上,这不是一个代码编写服务,所以解决方案通常不是完全完成的工作代码。但这使得无效数字未被检查。他们是应该选择崩溃还是违约,这取决于OP@Vladimir感谢你周到的回答。我从来没有想过我可以读取行变量。它工作得很好。好主意,不过我会检查一个空字符串作为默认值。键入错误的数字不应导致默认值。你也可以把它放在一个循环中,重新编译另一个条目以从错误中恢复。好吧,当然,但这是在OP上,而不是在我身上设置确切的条件。如果你查看原始代码,他会检查负数并停止。他也可以把这张支票留在那里。基本上,这不是一个代码编写服务,所以解决方案通常不是完全完成的工作代码。但这使得无效数字未被检查。他们是应该选择崩溃还是违约,这取决于OP@Vladimir感谢你周到的回答。我从来没有想过我可以读取行变量。效果很好,真的很有帮助。我想我更深入地理解了格式规范在IO语句中的作用,这真的很有帮助。我想我更深刻地理解了格式规范是如何在IO语句上工作的。