Можно ли вызвать функцию C из OCaml, эффективно передавая огромный массив? - PullRequest
1 голос
/ 06 июня 2009

Я рассматриваю возможность использования комбинации между кодом OCaml и C в новом приложении. Кажется, что вызывать код C из Ocaml просто:

    external name : type = C-function-name

Однако, похоже, что наоборот (вызов OCaml из C) сложнее:

  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.

Спасибо!

1 Ответ

3 голосов
/ 07 июня 2009

Во-первых, вы можете передать любое неправильное значение C в ocaml как абстрактный тип. Их общая проблема:

  • Вы не можете манипулировать абстрактным значением из ocaml без использования внешней функции, определенной в C
  • Сборщик мусора не освободит их, и у вас может быть утечка памяти (или использование какой-либо внешней функции для явного освобождения ее, но вы потеряете часть полезности ocaml)

Вы также можете использовать пользовательский блок, содержащий указатель на что-либо. Это также значение bastract (как в предыдущем случае), но вы можете добавить некоторый код, который будет вызываться, когда пользовательский блок GCed, и это позаботится об освобождении объекта C.

Тогда для массива integer / char / float у вас есть библиотека biggaray. «Указатель p на уже выделенный массив C или Fortran может быть упакован и возвращен в Caml как большой массив с помощью alloc_bigarray. или функции alloc_bigarray_dims. см. руководство

...