首页 文章

如何停止子程序并举起旗帜?

提问于
浏览
1

我在Fortran 95中编写一个程序(用gfortran编译),其中包含一个执行特定计算的子程序 . 正如S. J. Chapman在"Fortran 95/2003 for Scientists & Engineers"中所建议的那样,我试图在遇到错误时停止子程序并且"throw" [1]由调用程序发出错误标志_1168114_ [1],这将采取所有必要的操作 . 理想情况下,我想要的是:

! Pseudo-code
PROGRAM my_prog
    integer :: error_flag
    CALL my_subr (<input_args>, <output_args>, error_flag)
    ! Also error_flag is an output: 0 -> everything OK, 1 -> error
    IF (error_flag /= 0) THEN
        WRITE (*,*) 'Error during execution of "my_subr"'
    ELSE
        ... do something ...
    END IF
END PROGRAM my_prog

How can I stop the subroutine and gracefully handle the errors?

下面是一个示例: subroutine "division"采用整数输入值,并迭代地将其除以一个值,该值是输入值减去步数-1的值 . 当这样的值达到零时,应该引发一个标志,并且应该退出子程序而不执行除零 .

SUBROUTINE division (inval, outval, error_flag)
  IMPLICIT NONE

  INTEGER, INTENT(IN) :: inval
  REAL, INTENT(OUT) :: outval
  INTEGER, INTENT(OUT) :: error_flag ! 0 -> OK, 1 -> error

  INTEGER :: i
  REAL :: x

  error_flag = 0
  x = REAL(inval)
  DO i = 0, 10
     IF (inval-i == 0) error_flag = 1
     ! How can I gracefully exit now?
     x = x / REAL(inval-i)
  END DO

END SUBROUTINE division

PROGRAM my_prog
  IMPLICIT NONE
  REAL :: outval
  INTEGER :: error_flag
  CALL division (8, outval, error_flag)
  IF (error_flag == 1) THEN
     WRITE (*,*) 'Division by zero'
  ELSE
     WRITE (*,*) 'Output value:', outval
  END IF
END PROGRAM my_prog

笔记:

[1]我借用(可能是不恰当的方式)C的行话 .

2 回答

  • 1

    看到你的例子,你似乎只是错过了 return 声明:

    error_flag = 0
      x = REAL(inval)
      DO i = 0, 10
         IF (inval-i == 0) then
                             error_flag = 1
                             return
         END IF
    
         x = x / REAL(inval-i)
      END DO
    
  • 1

    一种可能性是改变

    DO i = 0, 10
         IF (inval-i == 0) error_flag = 1
         ! How can I gracefully exit now?
         x = x / REAL(inval-i)
      END DO
    

    DO i = 0, 10
         IF (inval-i == 0) THEN 
            error_flag = 1
            EXIT
         END IF
         ! Now you have gracefully exited
         x = x / REAL(inval-i)
      END DO
      ! Code to tidy up if the error flag was set
    

    这里 EXIT 语句退出循环 - 弗拉基米尔的答案向您展示如何使用 RETURN 更快地退出子程序 . 无论您选择哪种方法,都不要忘记在离开子程序之前分配给 outval .

相关问题