Fortranでfunction compositionを作成したいとします。私がf(x)とg(x)を持っていれば、f(g(x))を見つけたいと考えています。 Pythonの構文では簡単ですBetter Function Composition in Python。Fortranの関数の構成
module test10
implicit none
contains
function f5x (x)
real :: f5x
real, intent (in) :: x
f5x = 5.00*x
end function f5x
function f10x (x)
real :: f10x
real, intent (in) :: x
f10x = 10.00*x
end function f10x
end module test10
program call_test10
use test10
implicit none
real :: val1, val2, input
interface
real function fx_new (y)
real, intent (in) :: y
end function fx_new
end interface
input=1.0
write (*,*) 'Invoking f5x'
val1 = f5x(1.0)
write (*,*) val1
write (*,*) 'Invoking f10x'
val1 = f10x(1.0)
write (*,*) val1
write (*,*) 'Invoking f10x(f5x)'
procedure (fx_new), pointer :: ptr1 => f5x
procedure (fx_new), pointer :: ptr2 => f10x
val2 = ptr2(ptr1)
write (*,*) val2
end program call_test10
自身によって実行するステートメントval1 = f5x(1.0)
とval1 = f10x(1.0)
:ここ
は、サンプルのFortranコードです。しかし、機能構成に関しては、Fortranでどのように達成するかわかりません。私はf10x(f5x)を評価して、xに値を割り当てたいと思っています。何か案は?
モジュールファイルと関数の戻り値の型、引数の数、および引数の型が一致する場合、Fortranコンパイラはインクルードされたファイルで実行する関数を決定できますか?私が知りたいもう一つのことは、インタフェースを取り除くことができるかどうかです(プロシージャポインタなどを使用して)?外部関数を実行するためのインタフェースの考え方は私には分かりにくいので、可能であれば、インタフェースなしで外部関数を実行する方法を提案してください。私はキーワードexternal
を知っていますが、それは以前のバージョンのためのものでした(新しい標準では動作し続けていますが)。
手続きポインタは、新しい基準(2003、2008、...)にあるように、私は2008年
fortranでは閉鎖ができません。 – wey273824
ポインタ型バインドプロシージャによるユーザ定義の派生データ型と 'iso_c_binding'中の' c_f_pointer'プロシージャを使ったC言語スタイルのキャストの両方に頼らずにこの作業を達成できるとは思いません。とにかく、関数の構成は、引数がFortranでどのように渡されるかに違反します。参照:https://software.intel.com/en-us/blogs/2009/03/31/doctor-fortran-in-ive-come-here-for-an-argument – jlokimlin