インテル® Fortran コンパイラー 17.0 デベロッパー・ガイドおよびリファレンス
インテル® Fortran コンパイラーは Fortran 規格をサポートしており、Fortran コードと C コードの確実な互換性を提供します。
インテル® Fortran コンパイラーには C との互換性保持のための機能が含まれており、より移植性に優れた方法で言語が混在したプログラミングを可能にします。
Fortran 標準では、互換性保持について「コンパニオン C プロセッサー」として説明しています。各 Fortran 実装は、任意の C をコンパニオンとして選ぶことができます。Fortran 標準は明示的にコンパニオン C (C++ ではない) プロセッサーを指定していますが、Fortran との互換性を保持する場合、C と互換性のある機能を使用する限り、C++ を使用することができます。
インテル® Fortran でサポートされている C コンパニオンは、Windows® オペレーティング・システムではインテル® C++ コンパイラーまたは Microsoft® Visual C++® コンパイラー、Linux* および OS X* オペレーティング・システムではインテル® C++ コンパイラーまたは gcc です。
互換性保持の原則は、Fortran でも C と同じように動作することです。互換性保持には、次の条件が適用されます。
Fortran は、C プログラミング言語で定義されたプロシージャーや C プロトタイプで宣言されたプロシージャーを、それらが実際には C で定義されていなくても、参照する方法を提供します。
逆に、Fortran サブプログラムで定義されたプロシージャーは、C で定義された関数で参照できます。
さらに、名前に外部参照を含む C の変数に関連付けられたグローバル変数を定義できます。
また、同様の C 宣言に対応する Fortran の変数、データ構造、列挙子も宣言できます。
互換性保持のための型、変数、プロシージャー、およびグローバルデータに関する条件を次に示します。
次の例は、C 関数を呼び出します。
C 関数プロトタイプの例 |
---|
int C_Library_Function(void* sendbuf, int sendcount, int *recvcounts); |
Fortran モジュールの例 |
---|
module ftn_C_2 interface integer (C_INT) function C_Library_Function & (sendbuf, sendcount, recvcounts) & BIND(C, name='C_Library_Function’) use, intrinsic :: ISO_C_BINDING implicit none type (C_PTR), value :: sendbuf integer (C_INT), value :: sendcount type (C_PTR), value :: recvcounts end function C_Library_Function end interface end module ftn_C_2 |
Fortran 呼び出しシーケンスの例 |
---|
use, intrinsic :: ISO_C_BINDING, only: C_INT, C_FLOAT, C_LOC use ftn_C_2 ... real (C_FLOAT), target :: send(100) integer (C_INT) :: sendcount integer (C_INT), ALLOCATABLE, target :: recvcounts(100) ... ALLOCATE( recvcounts(100) ) ... call C_Library_Function(C_LOC(send), sendcount, & C_LOC(recvcounts)) ... |
次の例は、Simulation という Fortran のサブルーチンを呼び出します。 このサブルーチンは、C の void simulation 関数に対応します。
Fortran コード例 |
---|
subroutine Simulation(alpha, beta, gamma, delta, arrays) BIND(C) use, intrinsic :: ISO_C_BINDING implicit none integer (C_LONG), value :: alpha real (C_DOUBLE), intent(inout) :: beta integer (C_LONG), intent(out) :: gamma real (C_DOUBLE),dimension(*),intent(in) :: delta type, BIND(C) :: pass integer (C_INT) :: lenc, lenf type (C_PTR) :: c, f end type pass type (pass), intent(inout) :: arrays real (C_FLOAT), ALLOCATABLE, target, save :: eta(:) real (C_FLOAT), pointer :: c_array(:) ... ! c_array を C の配列割り当てに関連付けます call C_F_POINTER (arrays%c, c_array, (/arrays%lenc/) ) ... ! 配列を割り当て、C で利用できるようにします arrays%lenf = 100 ALLOCATE (eta(arrays%lenf)) arrays%f = c_loc(eta) ... end subroutine Simulation |
C 構造体宣言の例 |
---|
struct pass {int lenc, lenf; float *c, *f;}; |
C 関数プロトタイプの例 |
---|
void simulation(long alpha, double *beta, long *gamma, double delta[], struct pass *arrays); |
C 呼び出しシーケンスの例 |
---|
simulation(alpha, &beta, &gamma, delta, &arrays); |