Visual Fortran モジュールは Visual C/C++ から直接参照できるので,C との間で多数の変数を交換したい場合,モジュールを使うのが最も簡単です。次の例は Fortran 中でモジュールを宣言し,C からそのデータを参照しています。
Fortranコード:
! Fotran 90 モジュール定義 MODULE EXAMP REAL A(3) INTEGER I1, I2 CHARACTER(80) LINE TYPE MYDATA SEQUENCE INTEGER N CHARACTER(30) INFO END TYPE MYDATA END MODULE EXAMP
C コード:
/* モジュール・データを参照する C コード */ extern float EXAMP_mp_A[3]; extern int EXAMP_mp_I1, EXAMP_mp_I2; extern char EXAMP_mp_LINE[80]; extern struct { int N; char INFO[30]; } EXAMP_mp_MYDATA;
C++ のコードが .cpp ファイル (ビジュアル開発環境から C/C++ ファイルを選択したときに作成されます) 中に存在する場合,外部名に C++ のセマンティクスが適用され,一般にリンカー・エラーが発生します。この場合,extern "C" 構文を使用します (「Visual C/C++ と Visual Basic の名付け規約」を参照)。
C コード:
/* .cpp ファイルでのモジュール・データを参照する C コード */ extern "C" float EXAMP_mp_A[3]; extern "C" int EXAMP_mp_I1, EXAMP_mp_I2; extern "C" char EXAMP_mp_LINE[80]; extern "C" struct { int N; char INFO[30]; } EXAMP_mp_MYDATA;
また,C でモジュール手続を定義し,ALIAS 命令を使って,そのルーチンを Fortran モジュールの一部とすることができます。
C コード:
// C 手続 void pythagoras (float a, float b, float *c) { *c = (float) sqrt(a*a + b*b); }
同じ例で,C++ コードが .cpp ファイル中に存在するときには,extern "C" 構文を使用します (「Visual C/C++ と Visual Basic の名付け規約」を参照)。
C コード:
// C 手続 extern "C" void pythagoras (float a, float b, float *c) { *c = (float) sqrt(a*a + b*b); }
モジュール CPROC を定義する Fortran コード:
! 手続を含む Fortran 90 モジュール MODULE CPROC INTERFACE SUBROUTINE PYTHAGORAS (a, b, res) !DEC$ ATTRIBUTES C :: PYTHAGORAS !DEC$ ATTRIBUTES REFERENCE :: res ! 個々の属性がサブルーチンの C 属性で上書きされるため, ! res は参照で渡されます。 REAL a, b, res ! サブルーチンが C 属性を持っているので, ! a と b は基本設定の VALUE 属性を持っています。 END SUBROUTINE END INTERFACE END MODULE
モジュール CPROC を使って呼び出す Fortran コード:
! 手続を含む Fortran 90 モジュール USE CPROC CALL PYTHAGORAS (3.0, 4.0, X) TYPE *,X END