引用過程

要使函式或子例程有用,必須引用它。call 語句中引用了子例程

call sub(...)

和表示式中的函式。與許多其他語言不同,表示式不會形成完整的語句,因此函式引用通常出現在賦值語句中或以其他方式使用:

x = func(...)
y = 1 + 2*func(...)

指定正在引用的過程有三種方法:

  • 作為過程或過程指標的名稱
  • 派生型別物件的過程元件
  • 型別繫結過程繫結名稱

第一個可以看作是

procedure(), pointer::sub_ptr=>sub
call sub()   ! With no argument list the parentheses are optional
call sub_ptr()
end

subroutine sub()
end subroutine

最後兩個為

module mod
  type t
    procedure(sub), pointer, nopass::sub_ptr=>sub
  contains
    procedure, nopass::sub
  end type

contains

  subroutine sub()
  end subroutine

end module

use mod
type(t) x
call x%sub_ptr()   ! Procedure component
call x%sub()       ! Binding name

end

對於具有偽引數的過程,引用需要相應的實際引數,儘管可能未給出可選的偽引數。

考慮子程式

subroutine sub(a, b, c)
  integer a, b
  integer, optional::c
end subroutine

這可以通過以下兩種方式引用

call sub(1, 2, 3)   ! Passing to the optional dummy c
call sub(1, 2)      ! Not passing to the optional dummy c

這就是所謂的位置引用:實際引數根據引數列表中的位置關聯。這裡,虛擬 a1b2c(當指定時)與 3 相關聯。

或者,當過程具有可用的顯式介面時,可以使用關鍵字引用

call sub(a=1, b=2, c=3)
call sub(a=1, b=2)

與上述相同。

但是,對於關鍵字,可以按任何順序提供實際引數

call sub(b=2, c=3, a=1)
call sub(b=2, a=1)

可以使用位置和關鍵字引用

call sub(1, c=3, b=2)

只要在第一次出現關鍵字後為每個引數指定關鍵字

call sub(b=2, 1, 3)  ! Not valid: all keywords must be specified

當存在多個可選的偽引數時,關鍵字引用的值尤為明顯,如下所示,如果在上面的子例程定義中 b 也是可選的

call sub(1, c=3)  ! Optional b is not passed

帶有傳遞引數的型別繫結過程或元件過程指標的引數列表將單獨考慮。