一回も披露したことのない豆知識

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

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

この回答への補足

説明不足でした。すいません。
ラッパーを作っています。
ユーザ関数が引数により渡されるのですが、実際に使用する関数の引数並びが異なっています。
その為、渡されたユーザ関数を実行する別のユーザ関数を作成しています。
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
    • good
    • 0

なんで sub2 に (sub で受け取った) func1 を渡さないのか. 現状のまま Fortran90 で動かすのは無理のよ

うな気がする. 2003 以上ならまさに「関数 (というか外部手続) へのポインタ」が使えそうなんだけど.

この回答への補足

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
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!