替代返回

備用返回是一種控制子程式返回時執行流程的工具。它通常用作錯誤處理的一種形式:

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