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/C Renvoyer un tableau de string ?


Sujet :

Caml

  1. #1
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut OCaml/C Renvoyer un tableau de string ?
    Bonjour !

    Je fais un joli (hrem... bof bof ) petit programme en OCaml et en C !
    J'arrive a appeler la aprtie OCaml depuis le C comme il faut.... tout fonctionne pour le moment, car je ne fais qu'afficher du debug depuis OCaml pour verifier le retour de mes fonctions !
    Je souhaiterai maintenant renvoyer un resultat au C.

    J'ai trouve pas mal de tutos qui m'ont grandement aides, mais je n'ai toujours pas trouve comment renvoyer un tableau de string et d'int vers du C !
    Les Bigarrays avaient l'air bien... mais il ne gerent que les nombres apparemment :S

    De plus, je souhaite renvoyer, en fonction d'un parametre, des tableaux avec des formes differentes... est-ce possible ?
    Ou dois-je faire 2 fonctions "externes" qui renvoient 2 tableaux differents ? (et c'est le C qui appelle le tableau d'une forme, ou de l'autre)

    explication :
    si var1 = 1, je renverrais un tableau comme ca : [string, int, int]
    sinon, je renvoie : [string, int, int, string, string, string, string]


    Merci d'avance !

  2. #2
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Je pense avoir trouve mon bonheur avec le tuto d'un membre present ici et sur le SdZ !

    Merci d'avance/en retard a Cacophrene pour ce superbe tuto qui explique meme l'utilisation des listes OCaml dans le C !

  3. #3
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Bonjour,

    On parle de moi ?
    Si tu as des questions n'hésite pas, j'ai écrit ce tuto il y a quelque temps et tout n'était pas encore limpide pour moi.

    Cordialement,
    Eddy

  4. #4
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    TOUT fonctionne ! Merci beaucoup Cacophrene du tuto !
    Je vais quand meme presenter un peu ce que j'ai fais !

    Cote OCaml :
    J'ai une liste de tuples de la forme :
    (string, (int, int), string, string, string, string, string)::tail

    Et pour lire tout cela en C :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    void            send_str(char   *str,
                             int    with_date)
    {
      value         *f;
      CAMLlocal4    (caml_str, caml_int, caml_res, head);
      char *domain;
      int mo, o;
      char *j;
      char *m;
      char *a;
      char *h;
      char *decalage;
     
      CAMLparam0();
      caml_str = caml_copy_string(str);
      caml_int = Val_int(with_date);
      f = caml_named_value("call_me");
      caml_res = caml_callback2(*f, caml_str, caml_int);
     
      while (caml_res != Val_emptylist)
      {
        head = Field(caml_res, 0);
        domain = String_val(Field(head, 0));
        mo = Int_val(Field(Field(head, 1), 0));
        o = Int_val(Field(Field(head, 1), 1));
        j = String_val(Field(head, 2));
        m = String_val(Field(head, 3));
        a = String_val(Field(head, 4));
        h = String_val(Field(head, 5));
        decalage = String_val(Field(head, 6));
        printf("Domaine : %s\nMo consommes : %d\noctets consommes : %d\nLe %s/%s/%s a %sh avec %s\n", domain, mo, o, j, m, a, h, decalage);
        caml_res = Field(caml_res, 1);
      }
      CAMLreturn0;
    }
    Le code en est encore au stade "developpement a l'arrache"... mais je decouperai proprement en sous-fonctions tout cela !... le principal c'est que ca marche !

    C'est un petit parser de logs Apache dont la partie lexing/parsing se fait en OCaml (grace aux filtrages successifs, je reduis le nombre de lignes a lire, puis avec la ExtLib je coupe au fur et a mesure le contenu de la ligne pour en faire des listes de tuples.... puis je renvoie le tout au C)...
    Et en C j'ecrirai tout ca dans une base de donnees !...
    On me dit que j'aurai pu le faire en OCaml directement... mais je voulais faire un "bel" (hrem xD) interfacage une fois dans ma vie !
    Et donc voila !

    J'espere que mon bout de code en aidera d'autres plus tard en supplement de ton tuto !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ranger un tableau de String dans ma HashMap
    Par jeyce dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 26/08/2004, 22h41
  2. [Collections] Conversion de Vector en tableau de String
    Par java_math dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 06/06/2004, 12h55
  3. [Collections] Tableau de String
    Par gexti dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 02/06/2004, 15h42
  4. [VB6] [Syntaxe] Fonction renvoyant un tableau d'objets
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/10/2002, 15h33
  5. fonction renvoyant un tableau en argument
    Par Jones dans le forum Langage
    Réponses: 6
    Dernier message: 30/09/2002, 18h20

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