サーチ…


内部/モジュールサブプログラムと明示的なインタフェース

サブプログラムプロシージャを定義する)は、 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であろうと、
  • 引数a1a2x1x2 、...の名前とプロパティである。
  • これは結果 ffunction場合)のプロパティです。

知られているインターフェースなので、コンパイラは実引数(かどうかを確認することができますarg1arg2xx1xx2fx 、...)仮引数(と手続きの試合に渡されたa1a2x1x2f .. )。

この場合、インターフェースは明示的です。

サブプログラムは、それが含まれているモジュール自体のステートメントによって呼び出されたときにモジュール・サブプログラムと呼ばれ、

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以外のプログラミング言語を使用して定義することができます。

外部サブプログラムが呼び出されると、コンパイラはそのコードにアクセスすることができないため、コンパイラに許可されるすべての情報は呼び出し側プログラムの呼び出しステートメントに暗黙的に含まれ、仮引数のプロパティではなく仮引数その宣言はコンパイラには分かりません)。この場合、インタフェースは暗黙的であると言います。

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