Fortran
Явные и неявные интерфейсы
Поиск…
Внутренние / модульные подпрограммы и явные интерфейсы
Подпрограмма (которая определяет процедуру ) может быть либо 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