我正在考虑在新应用程序中结合使用 OCaml 和 C 代码。从 Ocaml 中调用 C 代码似乎很简单:
external name : type = C-function-name
然而,似乎反过来(从 C 调用 OCaml)也更复杂:
static void
call_ocaml_void (const char * name)
{ CAMLparam0 () ;
CAMLlocal1 (ostr) ;
ostr = caml_copy_string (name);
value * func = caml_named_value ("ocaml_puts") ;
if (func == NULL)
puts ("caml_named_value failed!") ;
else
caml_callback (*func, ostr) ;
CAMLreturn0 ;
} /* call_ocaml_void */
(来自 page 的示例)
尤其是,它涉及复制。
谁能告诉我是否可以允许从两种语言访问数据结构?所以函数只能传递指向结构的指针,但两种语言都可以读取它。
目标是用OCaml完成所有操作,然后将数据以高效的方式传递到C环境。
谢谢!
最佳答案
首先,您可以将任何 C 分配的值作为抽象类型传递给 ocaml。他们对此有几个问题:
- 如果不使用 C 中定义的外部函数,则不能从 ocaml 中操作抽象值
- 垃圾收集器不会释放它们,你可能会发生内存泄漏(或者使用一些外部函数来显式释放它,但你会失去 ocaml 的部分用处)
您还可以使用包含指向任何内容的指针的自定义 block 。这也是一个基本值(如前例所示),但您可以添加一些代码以在自定义 block 被 GC 时调用,这将负责释放 C 对象。
然后对于整数/字符/ float 数组,你有 biggaray 库“指向已分配的 C 或 Fortran 数组的指针 p 可以使用 alloc_bigarray 包装并作为大数组返回给 Caml 或 alloc_bigarray_dims 函数。 "参见 the manual
关于c - 是否可以从 OCaml 调用 C 函数并有效地传递一个巨大的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/960298/