Je considère l'utilisation d'une combinaison entre OCaml et le code C dans une nouvelle application. Il semble que l'appel du code C OCaml est simple:Est-il possible d'appeler une fonction C depuis OCaml en passant un grand tableau efficacement?
external name : type = C-function-name
Cependant, il semble aussi que dans l'autre sens (appelant OCaml de C) est plus compliquée:
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 */
(exemple de cette page)
Et surtout, cela implique une copie.
Quelqu'un pourrait-il me dire s'il est possible de permettre l'accès à une structure de données des deux langues? Ainsi, les fonctions ne peuvent transmettre que des pointeurs vers la structure, mais les deux langues peuvent le lire quand même.
L'objectif est de faire toutes les opérations avec OCaml, puis de transmettre les données à l'environnement C de manière efficace.
Merci!
Parfait. Ce lien est exactement ce dont j'avais besoin. Merci beaucoup! – alvatar
Vous voulez vraiment bigarrays. Mais remi, le garbage collector va libérer les types abstraits, pourquoi pensez-vous que vous avez les opérations personnalisées struct en C et appelez pour les enregistrer avec le GC? – nlucaroni
malloc allouer de la mémoire en dehors du caml Heap, et caml ne pas GC chose en dehors de son tas. Donc, si votre valeur abstraite est juste un pointeur C vers la mémoire mallocée, caml ne le libérera pas. Les blocs personnalisés sont GCed, mais pas le pointeur C pur. –