1

Fortran 77 に ema 関数があります。C から Fortran 関数を呼び出すにはどうすればよいですか。Fortran 2003 には iso_c_bindings があることは知っていますが、古い 77 標準の解決策が必要です。

subroutine ema(inarray,leninarray,n,outarray,lenoutarray)

integer leninarray, lenoutarray, n, i
double precision inarray(leninarray), outarray(lenoutarray)

do 10 i = n+1, leninarray
    outarray = inarray(i) * (1/n) + outarray(i-1) * (1-(1/n))

continue
end

助けてくれてありがとう

4

1 に答える 1

3

Fortran の呼び出し規約は C とほとんど同じですが、次の違いがあります。

  • すべてが参照によって渡されます。アドレスを fortran ルーチンに渡す必要があります。
  • 引数の順序は同じです (右から左にプッシュされます)。
  • fortran 関数 (fortran サブルーチンではない) を呼び出すときは、引数の後に戻り値のアドレスをスタックにプッシュする必要があります。対応する C プロトタイプでは、これは関数 void を宣言し、戻り値へのポインターである追加の最初の引数を持つことになります。
  • 場合によっては、Fortran 名にアンダースコアを追加する必要があります。これにはいくつかの実験が必要です。

たとえば、Fortran ルーチンがある場合

subroutine ema(inarray,leninarray,n,outarray,lenoutarray)

それはに変わります

void ema(double*, int*, int*, double*, int*)

また

void ema_(double*, int*, int*, double*, int*)

お使いのマシンによって異なります。あなたが望むC ++で

extern "C" void ema(double*, int*, int*, double*, int*)

また

extern "C" void ema_(double*, int*, int*, double*, int*)

インデックスをルーチンに渡すとき、Fortran 配列は 1 から始まることを忘れないでください。

于 2010-09-16T10:51:06.047 に答える