Поиск…


Внутренние / модульные подпрограммы и явные интерфейсы

Подпрограмма (которая определяет процедуру ) может быть либо subroutine либо function ; он называется внутренней подпрограммой, если он вызывается или вызывается из той же самой program или подпрограммы, которая contains ее, следующим образом

program my_program

  ! declarations
  ! executable statements,
  ! among which an invocation to
  ! internal procedure(s),
  call my_sub(arg1,arg2,...)
  fx = my_fun(xx1,xx2,...)

contains
  
  subroutine my_sub(a1,a2,...)
    ! declarations
    ! executable statements
  end subroutine my_sub

  function my_fun(x1,x2,...) result(f)
    ! declarations
    ! executable statements
  end function my_fun

end program my_program

В этом случае компилятор будет знать все о любой внутренней процедуре, поскольку он относится к программному блоку в целом. В частности, он «увидит» interface процедуры, то есть

  • является ли это function или subroutine ,
  • которые являются именами и свойствами аргументов a1 , a2 , x1 , x2 , ...,
  • которые являются свойствами результата f (в случае function ).

Будучи известным интерфейсом, компилятор может проверить, xx1 ли фактические аргументы ( arg1 , arg2 , xx1 , xx2 , fx , ...) в соответствие с фиктивными аргументами ( a1 , a2 , x1 , x2 , f , .. .).

В этом случае мы говорим, что интерфейс явный .

Подпрограмма называется подпрограммой модуля, когда она вызывается оператором в самом содержащем модуле,

module my_mod

  ! declarations

contains
  
  subroutine my_mod_sub(b1,b2,...)
    ! declarations
    ! executable statements
    r = my_mod_fun(b1,b2,...)
  end subroutine my_sub

  function my_mod_fun(y1,y2,...) result(g)
    ! declarations
    ! executable statements
  end function my_fun

end module my_mod

или инструкцией в другом программном модуле, use этот модуль,

program my_prog

  use my_mod

  call my_mod_sub(...)

end program my_prog

Как и в предыдущей ситуации, компилятор будет знать все о подпрограмме, и поэтому мы говорим, что интерфейс явный .

Внешние подпрограммы и неявные интерфейсы

Подпрограмма называется внешней, если она не содержится в основной программе, ни в модуле, ни в подпрограмме antoher. В частности, его можно определить с помощью языка программирования, отличного от Fortran.

Когда вызывается внешняя подпрограмма, компилятор не может получить доступ к его коду, поэтому вся информация, разрешенная компилятору, неявно содержится в вызывающем операторе вызывающей программы и в типе свойства аргументов acutal, а не фиктивных аргументов ( чья декларация неизвестна компилятору). В этом случае мы говорим, что интерфейс неявный .

external оператор может использоваться для указания того, что имя процедуры относится к внешней процедуре,

external external_name_list

но даже при этом интерфейс остается неявным.

interface блок может использоваться для указания интерфейса внешней процедуры,

interface
  interface_body
end interface

где interface_body обычно является точной копией заголовка процедуры, за которой следует объявление всех его аргументов и, если это функция, результата.

Например, для функции WindSpeed

real function WindSpeed(u, v)
  real, intent(in) :: u, v
  WindSpeed = sqrt(u*u + v*v)
end function WindSpeed

Вы можете написать следующий интерфейс

interface
  real function WindSpeed(u, v)
    real, intent(in) :: u, v
  end function WindSpeed
end interface


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow