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
防止在输入字符而不是数字时关闭FORTRAN_Fortran_Gfortran - Fatal编程技术网

防止在输入字符而不是数字时关闭FORTRAN

防止在输入字符而不是数字时关闭FORTRAN,fortran,gfortran,Fortran,Gfortran,我有一个read语句,它需要一个数字,非常简单的示例代码: program test integer var read(*,*) var end PROGRAM test CHARACTER(len=100) :: input LOGICAL :: is_numeric, success INTEGER :: var DO READ(*,*) :: input IF (is_numeric(input)) THEN READ(input,*) var success = .TRUE

我有一个read语句,它需要一个数字,非常简单的示例代码:

program test
integer var
read(*,*) var
end
PROGRAM test
CHARACTER(len=100) :: input
LOGICAL :: is_numeric, success
INTEGER :: var

DO 
READ(*,*) :: input
IF (is_numeric(input)) THEN
  READ(input,*) var
  success = .TRUE.
ELSE
  WRITE(*,*) 'ERROR: Input is not numeric.'
END IF

IF (success) THEN
  break
END IF

END DO

END PROGRAM test


LOGICAL FUNCTION is_numeric(string)
  IMPLICIT NONE
  CHARACTER(len=*), INTENT(IN) :: string
  LOGICAL :: is_numeric
  INTEGER :: var
  INTEGER :: error_val
  READ(string,*,IOSTAT=error_val) x ! This line converts string to an integer
                            ! If there was an error, the error_val variable is
                            ! non-zero

  is_numeric = error_val==0

END FUNCTION is_numeric
问题是,由于分心,我通常会输入一串字符(即:是)。如何防止代码完全停止,而显示输入错误值类型的错误消息。再试一次

我的想法是:

    program test
    integer var
10  read(*,*) var
    if (var.not.a.number) then
      write(*,*)'You've entered an incorrect value. Try again'
      goto 10
    endif
    end
var.not.a.number情况会是什么样子? 我使用
gfortran
在Ubuntu下编译


编辑:谢谢大家!我最终实现了HPM的第三个选项,因为它是最简单的选项:

    program test
    integer var,iostat,ios
10  read(*,*,iostat=ios) var
    if (ios.ne.0) then
      write(*,*)'You've entered an incorrect value. Try again'
      goto 10
    endif
    end

特别感谢
User7391
为编写所有代码付出的努力

也许您可以将值读入字符变量,然后相应地处理该字符变量

如果它只包含数字,则将其存储在var中,否则,报告错误并循环

检查字符是否只有数字,请考虑此示例代码:

program test
integer var
read(*,*) var
end
PROGRAM test
CHARACTER(len=100) :: input
LOGICAL :: is_numeric, success
INTEGER :: var

DO 
READ(*,*) :: input
IF (is_numeric(input)) THEN
  READ(input,*) var
  success = .TRUE.
ELSE
  WRITE(*,*) 'ERROR: Input is not numeric.'
END IF

IF (success) THEN
  break
END IF

END DO

END PROGRAM test


LOGICAL FUNCTION is_numeric(string)
  IMPLICIT NONE
  CHARACTER(len=*), INTENT(IN) :: string
  LOGICAL :: is_numeric
  INTEGER :: var
  INTEGER :: error_val
  READ(string,*,IOSTAT=error_val) x ! This line converts string to an integer
                            ! If there was an error, the error_val variable is
                            ! non-zero

  is_numeric = error_val==0

END FUNCTION is_numeric
如果您在编写示例代码方面需要帮助,请告诉我

您需要能够将字符转换为整数。这可以通过内部读/写语句实现。

使用旧FORTRAN:

90 continue
read (*, *, err=90) number
这可以做得更详细,您可以测试错误并输出错误消息。

您使用的是列表定向输入。语句
read(*,*)
中的第二个
*
本质上告诉编译器/运行时系统,您将在运行时为它提供可以解释为
整数的内容。如果你想给自己在输入上犯错误的自由,你有(至少)3个选择

  • 正如@User7391的答案所说,您可以将输入读入字符变量,然后自己解析它。那个善良的用户甚至愿意为你写代码
  • 您可以将read命令修改为类似于
    read(*,*,err=1234)
    的内容,其中
    1234
    是错误处理语句的标签。这种方法现在被认为相当过时,可能会遭到反对
  • 您可以将read命令修改为类似于
    read(*,*,iostat=ios)
    的内容,其中
    ios
    是一个整数变量,它捕获
    read
    语句报告的
    iostat
    (i/o状态标志)。然后,您可以编写行
    if(iostat/=0).
    以进行错误处理。这被认为是最新的方法

  • 注意,使用这种方法,您可以进一步处理输入字符串,例如允许“端到端”输入。