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

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