fortran90 引数で渡された関数の呼び出し
fortran90を始めて間もない者です。
メインプログラムより呼び出しているサブルーチンにユーザ関数を渡しています。
このサブルーチンを自前で作成するのが目的です。
引数で受け取った関数を、自前の別関数より呼び出すにはどうしたら良いでしょうか。
Cであれば関数のポインタをグローバルな変数にセットしてやれば可能だと思いますが・・・
!--------------------------------
subroutine sub(func1, a)
real::a
interface
real function func1(x)
real::x
end function func1
real function func2(x)
real x
end function func2
end interface
call sub2(func2, a)
write(*,*) a
return
end subroutine sub
!--------------------------------
real function func2(x)
real::func2, x
! ここでfunc1を呼び出したい
! func2=func1(x)
end function func2
!--------------------------------
subroutine sub2(funca, a)
real::a
interface
real function funca(x)
real::x
end function funca
end interface
a=funca(10.)
return
end
!--------------------------------
program main
external func
real a
call sub(func, a)
write(*,*) a
end program
!--------------------------------
function func(x)
real func, x
func=2.*x*x
end function func
投稿日時 - 2011-03-03 10:59:50
このQ&Aは役に立ちましたか?
0人が「このQ&Aが役に立った」と投票しています
回答(2)
全然,何をやりたいのかが分からん。
とりあえずサンプルを見せるから,考えてみてね。
program main
external funca,funcb
real a, b
a=3.
call sub(funca,a)
write(*,*) a
b=4.
call sub(funcb,b)
write(*,*) b
end program
!--------------------------------
subroutine sub(func,x)
real x
interface
real function func(x)
real x
end function func
end interface
x=func(x)
return
end subroutine sub
!--------------------------------
real function funca(x)
real x
funca=2.*x*x
end function funca
!--------------------------------
real function funcb(x)
real x
funcb=3.*x
end function funcb
投稿日時 - 2011-03-04 11:30:52
説明不足でした。すいません。
ラッパーを作っています。
ユーザ関数が引数により渡されるのですが、実際に使用する関数の引数並びが異なっています。
その為、渡されたユーザ関数を実行する別のユーザ関数を作成しています。
fortranでは無理そうなのでCで実現しました。
float (*funcp)(float);
float execfunc(float);
void setfunc_( float (*func)(float) )
{
funcp=func;
}
float execfunc_(float x)
{
float ret;
ret = funcp(x);
return ret;
}
以上、自己解決しました。
ありがとうございました。
投稿日時 - 2011-03-04 17:27:46
なんで sub2 に (sub で受け取った) func1 を渡さないのか. 現状のまま Fortran90 で動かすのは無理のような気がする. 2003 以上ならまさに「関数 (というか外部手続) へのポインタ」が使えそうなんだけど.
投稿日時 - 2011-03-03 15:59:55
sub2で呼び出しているfunc2はfunc1とは異なる引数で作成したかったのです。
説明不足ですいません。
こんな感じです。
!--------------------------------
real function func2(x, y)
real::func2, x, y
real a, b
! ここでfunc1を呼び出したい
a=func1(x)
b=func1(y)
func2=a+b
end function func2
!--------------------------------
subroutine sub2(func2, a)
real::a
interface
real function func2(x, y)
real::x, y
end function func2
end interface
a=func2(10., 20.)
return
end
----------------------------------
もう少し考えて、無理そうならC言語で一部作成しようと思います。
ちなみにsubの中でfunc1を呼び出すentryを定義してみましたが実行エラーとなりました。
ありがとうございました。
投稿日時 - 2011-03-03 17:20:18