引用过程

要使函数或子例程有用,必须引用它。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

带有传递参数的类型绑定过程或组件过程指针的参数列表将单独考虑。