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

ポインター

C ポインターとの互換性を保持するために、ISO_C_BINDING モジュールには、C のオブジェクト・ポインターおよび関数ポインターと互換性のある、派生型 C_PTR と C_FUNPTR が含まれています。

これらの型およびモジュールの特定のプロシージャーは、2 つの言語間で動的配列を渡すためのメカニズムを提供します。動的配列の要素は、メモリー内で連続して格納する必要がないため、Fortran ポインターのターゲットまたは形状引き継ぎ配列を C へ渡すことはできません。ただし、すでに割付けられている割付け配列を C へ渡したり、C で割付けられた配列を Fortran ポインターに関連付けることはできます。さらに、次のように、C 形式のポインターを Fortran 形式のポインターに変換することもできます。

Fortran プログラムの例

program demo_c_f_pointer
       use, intrinsic :: iso_c_binding
       implicit none
    
       interface
         function make_array(n_elements) bind(C)
           import ! iso_c_binding を可視にする
           type(C_PTR) :: make_array
           integer(C_INT), value, intent(IN) :: n_elements
         end function make_array
       end interface
    
       type(C_PTR) :: cptr_to_array
       integer(C_INT), pointer :: array(:) => NULL()
       integer, parameter :: n_elements = 3 ! 要素の数
    
       ! 配列を作成して要素を格納する C 関数を呼び出す
       cptr_to_array = make_array(n_elements)
       ! n_elements 要素の配列への Fortran ポインターに変換
       call C_F_POINTER (cptr_to_array, array, [n_elements])
       ! 値を出力
       print *, array
    
end program demo_c_f_pointer

C モジュールの例

#include <stdlib.h>
int  *make_array(int n_elements) {
           int *parray;
           int i;
	parray = (int*) malloc(n_elements * sizeof(int));
	for (i = 0; i < n_elements; i++) {
		parray[i] = i+1;
	}
	return parray;
 }