2016-08-05 5 views
6

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ビット

答えて

3

が本当にあなたの環境で8ているのですか? Win64ので

、x86_64版-W64-MINGW32-GCC(のCygwinのにMinGW64コンパイラ)とOCamlの4.03.0は、あなたのコードは、(代わりに-1の版画4294967295、)あなたが説明した動作します。そこに、sizeof(int)ではなく、返信8しかし4です。

intlong longに変更すると問題が解決しました。私はCの達人ではないので間違っているかもしれませんが、OCamlのnativeintは、基礎となるCコンパイラのintではないかもしれません。

2

In sizeof(int)は、64ビットプラットフォームでは8ではない可能性があります。

nativeintタイプをCバインディングに使用する場合は、<caml/config.h>を含めるのが最も簡単で、そこに定義されているintnatタイプを使用します。

だからあなたの例を書き換える:

/* nativeintarray.c */ 
#include <stdio.h> 
#include <assert.h> 

#include <caml/config.h> 
#include <caml/memory.h> 
#include <caml/bigarray.h> 

CAMLprim value make_array(value unit) { 
    CAMLparam1(unit); 
    intnat* a = calloc (1, sizeof(intnat)); 
    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)); 
} 
関連する問題