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

时间:2009-06-06 18:57:24

标签: 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环境。

谢谢!

1 个答案:

答案 0 :(得分:3)

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

  • 如果不使用C
  • 中定义的外部函数,则无法操作ocaml中的抽象值
  • 垃圾收集器不会释放它们,并且你可能有内存泄漏(或使用一些外部函数来明确释放它,但你失去了部分有用的ocaml)

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

然后对于整数/ char / float数组,你有biggaray库“一个已经分配的C或Fortran数组的指针p可以被包装并使用alloc_bigarray作为一个大数组返回到Caml  或alloc_bigarray_dims函数。 “见the manual