替代返回
备用返回是一种控制子程序返回时执行流程的工具。它通常用作错误处理的一种形式:
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
分别参考标记为 100
和 200
的语句。
在子程序本身中,与备用返回相对应的 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