インテル® Fortran コンパイラー 17.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;
} |