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 の有用性の一部が失われます)。

何かへのポインタを含むカスタム ブロックを使用することもできます。これも (前のケースのように) Bastract 値ですが、カスタム ブロックが GC されたときに呼び出されるコードを追加して、C オブジェクトの解放を処理することができます。

次に、integer/char/float の配列については、biggaray ライブラリがあります

于 2009-06-06T22:52:38.933 に答える