Fortran
명시 적 인터페이스와 암시 적 인터페이스
수색…
내부 / 모듈 서브 프로그램 및 명시 적 인터페이스
서브 프로그램 ( 프로 시저 를 정의 함)은 subroutine
이나 function
일 수 있습니다. 다음과 같이 내부 프로그램 이 호출되거나 내부 프로그램 을 contains
하는 동일한 서브 program
에서 호출되는 경우 내부 서브 프로그램 이라고합니다
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
의 경우)의 특성입니다.
알려진 인터페이스이므로 컴파일러는 프로 시저에 전달 된 실제 인수 ( 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
위의 상황에서와 같이 컴파일러는 서브 프로그램에 대한 모든 것을 알 수 있으므로 인터페이스가 명시 적이라고합니다.
외부 서브 프로그램 및 암시 적 인터페이스
서브 프로그램은 주 프로그램이나 모듈 또는 앤서 보조 프로그램에 포함되어 있지 않을 때 외부 라고합니다. 특히 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