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