1

私は C++ と Fortran コードの両方を扱っています。C++ コードは、Fortran サブルーチンを呼び出す必要があります。Fortran サブルーチンの 1 つのパラメーターが Fortran 型complexです。

C++ コードは 1 つのファイルにあり、Fortran コード サブルーチンは別のファイルにあります。私は64 ビットシステムgccで andを使用しています。gfortranGNU/Linux

以下は、Fortran サブルーチン宣言 (およびいくつかの追加行) を示すスニペットです。

SUBROUTINE  minp (AMP,L,L2,FMINP,PHI)
   REAL*4 AMP( L ),FMINP( L )
   COMPLEX PHI( L )

C++ ファイルでは、Fortran コードに渡される引数は、値ではなく参照によって渡す必要があることを理解しています。externFortran サブルーチンは、キーワードを使用して C++ コード (ソース コード ファイルの先頭) で関数として宣言されます。

extern "C"
{
minp_ (float *amp, int &L, int &L2, float *fminp, complex *phi);

}

ただし、関数の最後のパラメーターは複雑な C 配列です。どうすれば次のことが可能になるでしょうか:

  1. phi引数として渡される C/C++ の複雑な配列にメモリを割り当てますか?
  2. Fortran コードでメモリを使用できるように、配列を引数として Fortran サブルーチンに渡しますか?
4

1 に答える 1

4

C (および extern C を介した C++) と Fortran のインターフェイスについては、Fortran の ISO C バインディングを使用することをお勧めします。C の型に合わせて、C_FLOAT_COMPLEX、C_DOUBLE_COMPLEX、および C_LONG_DOUBLE_COMPLEX という複合型を提供します。ISO C Binding を使用し、C コードに一致する Fortran インターフェイス宣言を作成することにより、C コンパイラの呼び出し規約に一致するように Fortran コンパイラに指示します。ISO C Binding で複合型を使用する場合、配列の扱いは float/double/long double 配列と何ら変わりません。gfortran マニュアルの混合言語プログラミングの章に例があり、組み込みモジュールの章で ISO C バインディングの型と組み込み手続きについて説明しています。

于 2012-11-22T21:50:36.473 に答える