1

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

本页示例)

特别是,它涉及复制。

谁能告诉我是否可以允许从两种语言访问数据结构?所以函数只能传递指向结构的指针,但两种语言都可以读取它。

目标是使用 OCaml 完成所有操作,然后以有效的方式将数据传递到 C 环境。

谢谢!

4

1 回答 1

3

首先,您可以将任何 C malloced 值作为抽象类型传递给 ocaml。他们对此有几个问题:

  • 如果不使用 C 中定义的外部函数,则无法从 ocaml 操作抽象值
  • 垃圾收集器不会释放它们,并且您可能会发生内存泄漏(或使用某些外部函数来显式释放它,但您会失去 ocaml 的部分用处)

您还可以使用包含指向任何内容的指针的自定义块。这也是一个基本值(如前一种情况),但您可以添加一些代码以在自定义块被 GC 时调用,这将负责释放 C 对象。

然后对于整数/字符/浮点数组,您有 biggaray 库“可以使用 alloc_bigarray 或 alloc_bigarray_dims 函数将指向已分配的 C 或 Fortran 数组的指针 p 包装并作为大数组返回给 Caml。”参见手册

于 2009-06-06T22:52:38.933 回答