替代返回

备用返回是一种控制子程序返回时执行流程的工具。它通常用作错误处理的一种形式:

real x

call sub(x, 1, *100, *200)
print*, "Success:", x
stop

100 print*, "Negative input value"
stop

200 print*, "Input value too large"
stop

end

subroutine sub(x, i, *, *)
  real, intent(out) :: x
  integer, intent(in) :: i
  if (i<0) return 1
  if (i>10) return 2
  x = i
end subroutine

备用返回由子例程伪参数列表中的参数*标记。

call 语句中,*100*200 分别参考标记为 100200 的语句。

在子程序本身中,与备用返回相对应的 return 语句有一个数字。此数字不是返回值,而是表示返回时传递执行的提供标签。在这种情况下,return 1 将执行传递给标记为 100 的语句,return 2 将执行传递给标记为 200 的语句。一个朴素的 return 语句,或完成没有 return 语句的子程序执行,passess 执行到调用语句后立即执行。

备用返回语法与其他形式的参数关联非常不同,并且该工具引入了与现代品味相反的流控制。可以通过返回整数状态代码来管理更令人满意的流控制。

real x
integer status

call sub(x, 1, status)
select case (status)
case (0)
  print*, "Success:", x
case (1)
  print*, "Negative input value"
case (2)
  print*, "Input value too large"
end select

end

subroutine sub(x, i, status)
  real, intent(out) :: x
  integer, intent(in) :: i
  integer, intent(out) :: status

  status = 0

  if (i<0) then
    status = 1
  else if (i>10)
    status = 2
  else
    x = i
  end if

end subroutine