🐕

C API で確保されたメモリを Fortran の配列にする

2021/02/22に公開

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_pointertype(c_ptr) のアドレス値をFortranにおけるポインタに変換するための関数です。第三引数に配列のshapeを取ることが可能です。

参考

GitHubで編集を提案

Discussion