前へ 上へ 次へ
前へ 上へ 次へ
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
前へ 上へ 次へ
