インテル® Fortran コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

標準の Fortran と C の互換性保持

インテル® Fortran コンパイラーは Fortran 規格をサポートしており、Fortran コードと C コードの確実な互換性を提供します。

インテル® Fortran コンパイラーには C との互換性保持のための機能が含まれており、より移植性に優れた方法で言語が混在したプログラミングを可能にします。

Fortran 標準では、互換性保持について「コンパニオン C プロセッサー」として説明しています。各 Fortran 実装は、任意の C をコンパニオンとして選ぶことができます。Fortran 標準は明示的にコンパニオン C (C++ ではない) プロセッサーを指定していますが、Fortran との互換性を保持する場合、C と互換性のある機能を使用する限り、C++ を使用することができます。

インテル® Fortran でサポートされている C コンパニオンは、Windows* オペレーティング・システムではインテル® C++ コンパイラーまたは Microsoft* Visual C++* コンパイラー、Linux* および macOS* オペレーティング・システムではインテル® C++ コンパイラーまたは gcc です。

互換性保持の原則は、Fortran でも C と同じように動作することです。互換性保持には、次の条件が適用されます。

互換性保持のための型、変数、プロシージャー、およびグローバルデータに関する条件を次に示します。

Fortran からの C の呼び出し例

次の例は、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)) 
...

C からの Fortran の呼び出し例

次の例は、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);