今だけ! NAG Fortran コンパイラ 
大学生協様限定 年度末キャンペーン実施中! 
 詳細は 大学生協様専用URL からどうぞ 
関連情報

ナビゲーション:前へ   上へ   次へ

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



ナビゲーション:前へ   上へ   次へ

Results matter. Trust NAG.