我想将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位
答案 0 :(得分:3)
您是否在环境中检查过sizeof(int)
真的是8
?
在Win64,OCaml 4.03.0和x86_64-w64-mingw32-gcc(Cygwin的MinGW64编译器)中,您的代码只是您所描述的(打印4294967295
,而不是-1
)。在那里,sizeof(int)
不返回8
但4
。
按int
更改long long
解决了问题。我不是C大师,所以我可能错了,但OCaml的nativeint
可能不是底层C编译器的int
。
答案 1 :(得分:2)
在C <p>Foo & Bar</p> // <-- this should still be &
<a href="http://mycoolpage.com/?page=1&fun=true&foo=bar&yes=no">
中,64位平台上可能不是sizeof(int)
。
如果您希望在C绑定中使用8
类型,最简单的方法是包含nativeint
并使用此处定义的<caml/config.h>
类型。
所以重写你的例子:
intnat