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