🐕
C API で確保されたメモリを Fortran の配列にする
CのAPIでメモリが確保されて、アドレスだけ帰ってくる関数があるとします。
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
int* myalloc() {
int* ptr = (int*) malloc(4 * sizeof(int));
ptr[0] = 1;
ptr[1] = 2;
ptr[2] = 3;
ptr[3] = 4;
return ptr;
}
例えばこのような myalloc
で確保されたメモリをFortranから配列として使うには次の様にします
program f1
use iso_c_binding
interface
function myalloc() bind(c)
import c_ptr
type(c_ptr) myalloc
end function
end interface
type(c_ptr) addr
integer, pointer :: array(:)
addr = myalloc()
call c_f_pointer(addr, array, [4])
print *, array ! [1, 2, 3, 4]
end
c_f_pointer
は type(c_ptr)
のアドレス値をFortranにおけるポインタに変換するための関数です。第三引数に配列のshapeを取ることが可能です。
Discussion