수색…


내부 / 모듈 서브 프로그램 및 명시 적 인터페이스

서브 프로그램 ( 프로 시저 를 정의 함)은 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


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow