c - 是否可以从 OCaml 调用 C 函数并有效地传递一个巨大的数组?

标签 c ocaml language-interoperability

我正在考虑在新应用程序中结合使用 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/

相关文章:

java - 通过隐式向伴生对象添加方法

compatibility - 我可以使用 oracle berkeley db java edition 的 c 实现(python bsddb)创建的 bdb(berkeley db)文件吗?

c++ - 错误 LNK2019 : unresolved external symbol "extern "C"what is this error?

c - 用 C 编写程序,通过 for 循环查找用户定义的平均值

c - 用于 C 运行时动态链接的 Matlab Engine API

types - 为什么这个 OCaml 定义接受了错误的类型?

OCaml "macros"用于在 String 和 Bytes 模块之间切换

c - 在 LGPL 代码中包含 GPL header

iphone - 将字符串值从 C 函数传递到 Xcode 中的目标代码

debugging - Emacs中如何实现错误回溯?