インテル® 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 ルーチンに定義して、Fortran ルーチンのインターフェイスのように使用します。C のコードは次のとおりです。
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
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