Fortran と C が混在したプログラミングにおけるモジュールの使用

インテル® 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