替代返回
備用返回是一種控制子程式返回時執行流程的工具。它通常用作錯誤處理的一種形式:
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