2009-06-06 8 views
1

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!

Répondre

3

Premièrement, vous pouvez passer n'importe quelle valeur Malloced à ocaml en tant que type abstrait. Leur sont problème severall avec ceci:

  • Vous ne pouvez pas manipuler une valeur abstraite de OCaml sans utiliser la fonction externe définie dans C
  • Le garbage collector ne sera pas les libérer, et vous pourriez avoir fuite de mémoire (ou utiliser une fonction externe pour le libérer explicitement, mais vous perdez une partie de l'utilité de ocaml)

Vous pouvez également utiliser un bloc personnalisé contenant un pointeur vers n'importe quoi. C'est aussi une valeur de bascule (comme dans le cas précédent) mais vous pouvez ajouter du code à appeler lorsque le bloc personnalisé est GCed et que cela prendra soin de libérer l'objet C.

Ensuite, pour un tableau de nombre entier/char/vous flottez avez la bibliothèque biggaray « Un pointeur p à un tableau C ou Fortran déjà alloué peut être enroulé et retourné à CAML comme un grand tableau en utilisant les fonctions alloc_bigarray ou alloc_bigarray_dims. "voir the manual

+0

Parfait. Ce lien est exactement ce dont j'avais besoin. Merci beaucoup! – alvatar

+0

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

+0

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. –

Questions connexes