インテル® Fortran モジュールは C/C++ から直接、アクセスすることができます。そのため、C 言語との間で多くの変数を交換するには、モジュール化が最も簡単な方法です。
次の例では、Fortran でモジュールが宣言されており、C からデータをアクセスできます:
Fortran のコード
! F90 Module definition 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 code accessing module data *\
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++ 言語のセマンティックスが外部名に適用されるため、 リンカエラーが頻繁に発生します。この場合は、extern "C" 構文 (詳細は、「C/C++ 命名規則」を参照してください) を使用します:
\* C code accessing module data in .cpp file*\
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 procedure void pythagoras (float a, float b, float *c) { *c = (float) sqrt(a*a + b*b); }
C++ のコードが .cpp
ファイルに存在する場合は、上記の例のように extern "C" 構文 (詳細は、「C/C++ 命名規則」を参照してください) を使用します:
// C procedure extern "C" void pythagoras (float a, float b, float *c) { *c = (float) sqrt(a*a + b*b); }
CPROC モジュールを定義する Fortran コード:
! Fortran 95/90 Module including procedure MODULE CPROC INTERFACE SUBROUTINE PYTHAGORAS (a, b, res) !DEC$ ATTRIBUTES C :: PYTHAGORAS !DEC$ ATTRIBUTES REFERENCE :: res ! res is passed by REFERENCE because its individual attribute ! overrides the subroutine's C attribute REAL a, b, res ! a and b have the VALUE attribute by default because ! the subroutine has the C attribute END SUBROUTINE END INTERFACE END MODULE
CPROC モジュールを使用して上記のルーチンを呼び出す Fortran コード:
! Fortran 95/90 Module including procedure USE CPROC CALL PYTHAGORAS (3.0, 4.0, X) TYPE *,X END