前へ 上へ 次へ
前へ 上へ 次へ
7 関数を安全に引数として渡す方法
関数を引数として渡したい場合があります。 例えば積分を行うサブルーチンや関数に被積分関数を渡したい場合などです。 そのような場合、引用仕様宣言(interface)を用いることで、これを安全に行うことができます。
以下の例では、引数として渡されてくる関数 f (仮引数)の引用仕様宣言を行っています。
[
func-arg.f90
] - 安全に関数を引数として渡すサンプル
module functions_module implicit none contains ! ! 被積分関数 ! double precision function myfunc(x) double precision, intent(in) :: x myfunc = sin(x) ** 2 end function end module program func_arg use functions_module implicit none print *, sekibun(myfunc, 0d0, 3.14159265358979d0) contains double precision function sekibun(f, a, b) ! ! 仮引数である関数 f の型を宣言する ! interface double precision function f(x) double precision, intent(in) :: x end function end interface double precision, intent(in) :: a, b double precision x1, step, x2 integer i integer, parameter :: n = 100 step = (b - a) / n sekibun = 0d0 x1 = a do i = 1, n x2 = a + step * i sekibun = sekibun + (f(x1) + f(x2)) * (x2 - x1) / 2d0 x1 = x2 end do end function end program 出力例: 1.5707963267948963
前へ 上へ 次へ