IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Caml Discussion :

[OCAML] Interface C / CAML, utiliser une matrice C dans OCAML


Sujet :

Caml

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 79
    Points : 56
    Points
    56
    Par défaut [OCAML] Interface C / CAML, utiliser une matrice C dans OCAML
    Bonjour à tous,

    Je suis à la recherche d'une solution pas trop compliquée d'accéder à des valeurs C en CAML, en particulier à une matrice que j'aimerai ne pas avoir à recopier en mémoire (elle fait une centaine de Mo).

    Le type value est bien sympa quand on reste dans les types simples, mais je ne le trouve pas du tout adapté pour ma matrice de s_pixel (un s_pixel contient 3 unsigned chars).
    Il est aussi possible que je n'ai pas bien compris le fonctionnement de l'interface C/CAML, mais j'ai passé pas mal de temps dessus et là je ne vois vraiment pas de solution pour manipuler une matrice que j'ai fait en C (et que j'ai besoin d'avoir à ma disposition en C) avec CAML.

    Je ne sais pas si je suis très clair, n'hésitez pas à me demander plus de précision :]

    Merci d'avance,

    iLUV

  2. #2
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Il est possible d'accéder depuis Objective Caml à une matrice C en utilisant la librairie Bigarray : elle permet de travailler avec des matrices C ou FORTRAN (c'est à peu près les mêmes).

    Je donne ici le point d'entrée pour la librairie normalement disponible sur ton système si tu l'as installé correctement. Pose des questions au fur et mesure que tu rencontres des difficultés : c'est une structure de données que j'ai beaucoup manipulée et donc je connais assez bien la chose.

    http://caml.inria.fr/pub/docs/manual...manual043.html

    La page principale du manuel de référence de Objective Caml est, elle, ici :

    http://caml.inria.fr/pub/docs/manual-ocaml/index.html

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 79
    Points : 56
    Points
    56
    Par défaut
    Alors tout d'abord je tiens a dire que cette lib est tout simplement fantastique !

    Je viens de lire le manuel, j'ai bien vu qu'on pouvait l'utiliser dans les deux sens, c'est plutot genial, et il me reste (pour l'instant) une petite question.

    La meilleure solution pour faire une matrice avec ma structure qui contient 3 chars est-elle de faire tout simplement un bigarray de dimension 2 (ma matrice) avec dans chaque case un bigarray de dimension 1 de trois cases avec chaqune des valeurs ?

    A priori cette solution me semble sympa mais ca m'obligerait a utiliser beaucoup de fois my_c_function, donc si par hasard une solution plus pratique se presentait, je suis preneur.

    (desole pour le manque d'accents, je suis actuellement en qwerty)

    Encore merci pour cette lib geniale !

    iLUV

  4. #4
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Citation Envoyé par iluv
    La meilleure solution pour faire une matrice avec ma structure qui contient 3 chars est-elle de faire tout simplement un bigarray de dimension 2 (ma matrice) avec dans chaque case un bigarray de dimension 1 de trois cases avec chaqune des valeurs ?
    J'ai peur de ne pas avoir bien compris ce que tu as voulu dire. Les bigarray Objective Caml ne sont pas comme les vecteurs Caml : en bref, on ne peut pas faire de bigarray de bigarray de bigarray etc... On ne peut créer que des bigarray de dimension figée, statique et intouchable par la suite, exactement comme en C, et ne contenant que des nombres (voir la documentation pour une énumération complète des types acceptables) !

    Citation Envoyé par iluv
    A priori cette solution me semble sympa mais ca m'obligerait a utiliser beaucoup de fois my_c_function, donc si par hasard une solution plus pratique se presentait, je suis preneur.
    Explique ce que tu veux dire : ce n'est pas clair du tout ainsi. A quoi sert your_c_function ? Que veux-tu dire par "3 chars" ? etc...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 79
    Points : 56
    Points
    56
    Par défaut
    Mmmh alors je viens de relire la doc. Si je comprend bien, les bigarrays servent uniquement a passer un tableau de dimension n (1 <= n <= 16) a C, que C pourra lire mais pas modifier (les veleurs doivent etre declarees en dur ou je peux mettre la valeur d'une variable a l'interieur du bigarray ?).
    Et il est impossible par la suite de faire que CAML lise/parcoure les valeurs de ce bigarray.
    (J'ai des doutes sur ma derniere phrase parceque dans ce cas a quoi sert la fonction alloc_bigarray ?)

    Explique ce que tu veux dire : ce n'est pas clair du tout ainsi. A quoi sert your_c_function ? Que veux-tu dire par "3 chars" ? etc...
    euh... j'ai mal lu (ca me semblait debile comme nom de fonction my_c_function) je voulais dire "utiliser plusieurs fois des Data_bigarray_val(v))

    Ce que je voulais dire avec mes "3 chars" c'etait que je veux que chaque case de mon tableau contienne un t_pixel, et mon t_pixel est un array de 3 uchar.
    Mais a priori ce n'est pas possible avec les bigarray, donc c'est pas bien grave.

    ------------------------

    Comme je ne suis pas sur d'avoir ete vraiment clair dans mes message precedents, j'essaye de reformuler mon probleme.

    Je fais (en C) une matrice a partir d'une image, chaque case represente un pixel (c'est donc un t_pixel --un array de 3 uchar-- qui represente trois composantes --rvb).
    Ce que je veux c'est pouvoir jongler et modifier cette matrice entre C et CAML pour effectuer differents traitements dessus.

    Donc existe-t-il soit une methode pas trop compliquee pour faire ce que je veux ?

    Bigarray me plaisait bien, mais je n'avais pas compris que c'etait du readonly, du coup c'est moins pratique, mais ca pourrait etre utilisable a condition de pouvoir parcourir cette matrice avec CAML et y mettre mon type t_pixel.


    iLUV

  6. #6
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Non : tu peux tout à fait modifier des bigarray depuis Objectiove Caml sans problèmes, et de même en C. Les bigarray SONT des matrices C.

    La méthode pas trop compliquée que tu veux est celle-ci.

    Relis bien la documentation ; essaye, et poste dès que tu rencontreras des problèmes.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 79
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par InOCamlWeTrust
    essaye, et poste dès que tu rencontreras des problèmes.
    Salut,
    J'ai mit un peu de temps à m'y mettre, mais voilà, j'y suis et je compte bien en finir.

    J'ai lu, relu, rerelu la doc, toussa, le bouquin o'reilly aussi etc. Je me suis fait un petit plan de ce que je voulais faire et comment y arriver, bref, je me sentais assez bien parti.

    Il me semble malgré tout avoir mal compris le fonctionnement de la fonction C alloc_bigarray.

    J'avais cru comprendre (à lire l'exemple) qu'il suffisait de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    return alloc_bigarray(BIGARRAY_UINT8 | BIGARRAY_C_LAYOUT, <nombre de dimensions de ma matrice>, <pointeur veurs le tableau que j'ai alloué plus tôt>, <un petit tableau qui précise la largeur et la hauteur de ma matrice>);
    Seulement, ça me fait un joli segfault à cet endroit.

    Pour plus de précision, voilà le code entier de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    value   give_pixmap(value       v_pic)
    {
      long          dims[2];
      s_picture     *pic;
     
      pic = (s_picture *) Int_val(v_pic);
     
      dims[0] = pic->height;
      dims[1] = pic->width;
     
      return (alloc_bigarray(BIGARRAY_UINT8 | BIGARRAY_C_LAYOUT, 2, pic->pixmap, dims));
    }
    s_picture est une structure dont le champs pixmap est un tableau de 2 dimensions de largeur width et de hauteur height (oui je suis un grand original).

    Le passage de pointeur avec le value passe bien (je suppose) vu que quand je donne les valeurs à dims[0] et dims[1] je n'ai pas de problème.
    J'en déduit donc que le problème vient de alloc_bigarray.

    Donc voilà, toi qui a bien plus utilisé bigarray que moi, si tu pouvais juste m'expliquer comment bien utiliser alloc_bigarray ce serait cool

    A bientôt,

    iLUV

    edit:
    Je m'en vais trois jours, je n'aurais pas le net, donc si quelqun qui se penche sur le sujet a une question je ne pourrai pas répondre d'ici là.
    Au cas où, voici le reste de mon code :
    C :
    bmp_loader2.c
    bmp_loader2.h
    CAML
    load_picture.ml
    Merci à tous

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 79
    Points : 56
    Points
    56
    Par défaut
    je suis de retour au cas où certaines personnes m'attendaient pour répondre :-°

    (mais non ceci n'est pas un up vous dis-je !)

  9. #9
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    J'essayerai de regarder ça en détail dès que j'aurai un peu de temps. Cette semaine, c'est un peu chaud. Je te tiens au courant.

Discussions similaires

  1. Utiliser une matrice dans Proc Factor
    Par Invité dans le forum SAS STAT
    Réponses: 0
    Dernier message: 30/05/2014, 15h23
  2. Réponses: 3
    Dernier message: 27/05/2013, 10h23
  3. Utiliser une matrice ou un tableau ?
    Par madaou dans le forum Pascal
    Réponses: 8
    Dernier message: 19/11/2008, 21h50
  4. Réponses: 1
    Dernier message: 13/04/2007, 14h33
  5. Réponses: 2
    Dernier message: 24/06/2003, 20h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo