int-arrayをCライブラリからOCamlプログラムに戻したいと思います。そうするために、私はちょうどBigarray.Array1.t
でそれらを包むと思った。以下は、C-スタブの小さなデモです:Nativeint Bigarrayは署名されていないようです
/* nativeintarray.c */
#include <stdio.h>
#include <assert.h>
#include <caml/memory.h>
#include <caml/bigarray.h>
CAMLprim value make_array(value unit) {
CAMLparam1(unit);
int* a = calloc (1, sizeof(int));
a[0] = -1;
/* Create a C-style bigarray, yes it is a memory leak */
CAMLreturn(caml_ba_alloc_dims(CAML_BA_NATIVE_INT | CAML_BA_C_LAYOUT, 1, a, 1));
}
私のプログラム例では、次のようになります。
(* nativeintarray.ml *)
open Bigarray
(** Type for int arrays from/to C *)
type ivector = (nativeint, nativeint_elt, c_layout) Array1.t
external make_array : unit -> ivector = "make_array"
let() =
Printf.printf "%nd\n" (make_array()).{0}
nativeint型が符号付き整数であるので、私は出力にプログラムを期待-1、代わりに、与える:
% ocamlbuild nativeintarray_c.o
Finished, 1 target (0 cached) in 00:00:00.
% ocamlbuild -package bigarray -lflags nativeintarray_c.o nativeintarray.native
Finished, 4 targets (0 cached) in 00:00:00.
% ./nativeintarray.native
4294967295
を私が言ったように、私は単純に私の地元のCコンパイラでint
に一致するようにnativeint
を期待しますが、これは明らかにそうではありません。誰かがこれを説明できますか?
プラットフォーム: OCamlの4.02.3、GCC 6.1.1、あなたがsizeof(int)
をチェックしているすべての64ビット