Nativeint Bigarray似乎没有签名

时间:2016-08-05 07:55:35

标签: c arrays int ocaml ffi

我想将int-arrays从C库返回到OCaml程序。为了做到这一点,我想我只是将它们包裹在Bigarray.Array1.t中。下面是C-stubs的一个小演示:

/* 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

正如我所说,我天真地期望nativeint匹配我本地C编译器中的int,但显然情况并非如此。有人可以解释一下吗?

平台: Ocaml 4.02.3,gcc 6.1.1,全部64位

2 个答案:

答案 0 :(得分:3)

您是否在环境中检查过sizeof(int)真的是8

在Win64,OCaml 4.03.0和x86_64-w64-mingw32-gcc(Cygwin的MinGW64编译器)中,您的代码只是您所描述的(打印4294967295,而不是-1)。在那里,sizeof(int) 返回84

int更改long long解决了问题。我不是C大师,所以我可能错了,但OCaml的nativeint可能不是底层C编译器的int

答案 1 :(得分:2)

在C <p>Foo &amp; Bar</p> // <-- this should still be &amp; <a href="http://mycoolpage.com/?page=1&fun=true&foo=bar&yes=no">中,64位平台上可能不是sizeof(int)

如果您希望在C绑定中使用8类型,最简单的方法是包含nativeint并使用此处定义的<caml/config.h>类型。

所以重写你的例子:

intnat