インテル® Fortran コンパイラー XE 13.1 ユーザー・リファレンス・ガイド
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; }