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

C++ Discussion :

Regex : Stocker les motifs compilés ?


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 34
    Par défaut Regex : Stocker les motifs compilés ?
    Bonjour,

    j'ai écris un programme en C++ qui utilise une suite de 150 recherches REGEX pour analyser un code (toujours les mêmes, dans le même ordre).

    Cette suite de recherche est réalisée plusieurs milliers de fois.
    Jusque là tout va bien, mais si je pouvais accélérer le mouvement ...

    Je me demandais si, en stockant les 150 motifs REGEX une fois compilé, je pourrais réaliser un gain de temps notable?

    Si oui quelqu'un saurait-il comment procéder?
    (mes connaissances en C++ ne m'ont pas permis d'en venir à bout.)

    Merci.

    PS : je suis débutant en C++ et débutant en forum, soyez deux fois plus indulgents.

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    T'utilises quel moteur de regexes ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 34
    Par défaut
    J'utilise Xcode sur macintosh, la bibliothèque REGEX était fournie avec.
    A priori,ça doit être voisin de Linux ...

    Dans l'en-tête regex.h, il y a le mot POSIX. Je crois que ça correspond au type de REGEX ( mais bon là j'y connais pas grand chose ...)

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Ok, donc les regexes posix.
    Tu peux les compiler avec regexcomp. Lis ton manuel.
    (D'ailleurs on est même obligé de les compiler dans un regex_t pour les utiliser ensuite)

    Après par contre c'est pas connu comme étant très rapide ni comme ayant beaucoup de fonctionnalités.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 34
    Par défaut
    Oui, je les compile avec regexComp mais ce que je ne sait pas faire, c'est stocker le resultat de la compilation pour l'utiliser ultèrieurement ...

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Bah tu stockes les regex_t.

    Après bon c'est du C, rien ne garantit que la copie fasse ce que tu veux. Donc pour faire ça proprement il te faut un truc genre les pointer containers.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 34
    Par défaut
    C'est ce que j'ai essayé. J'ai fait un tableau de type regex_t où j'ai stocké les résultats de regexComp, ça ne fonctionne pas.

    typedef struct {
    int re_magic;
    size_t re_nsub; /* number of parenthesized subexpressions */
    const char *re_endp; /* end pointer for REG_PEND */
    struct re_guts *re_g; /* none of your business :-) */
    } regex_t;

    ... est-ce que le pointer (lequel ?) pointe sur une zone de buffer qui est effacé par l'appel suivant? Est-ce qu'il faut fournir une adresse de stockage lors de l'appel de regexComp ?

  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    J'ai fait un tableau de type regex_t où j'ai stocké les résultats de regexComp, ça ne fonctionne pas.
    Comment ça, ça ne fonctionne pas ?

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 34
    Par défaut
    Ben, c'est à dire que avec les REGEX compilées au fur et à mesure le programme marche nickel. Avec les regex_t stockés dans un tableau, il plante. A l'execution au pas à pas,il semble que les pointeurs contenus dans les regex_t pointent sur des chaines vides ...

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 125
    Par défaut
    aux vues de la structure si tu fais une simples copie de regex_t
    tu vas avoir un pb avec les pointeurs car ils vont tous pointer sur la meme zone
    il te faut certainement mettre en place une allocation de re_endp et re_g
    puis d'en faire la copie en esperant qu il y ai pas d autre pointeurs dans re_g

  11. #11
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    aux vues de la structure si tu fais une simples copie de regex_t
    tu vas avoir un pb avec les pointeurs car ils vont tous pointer sur la meme zone
    Cela ne pose pas de problème tant qu'on ne libère pas l'une des copies.

    De toutes façons, pour rendre une bibliothèque C utilisable de manière correcte il faut l'enrober dans du C++. Autant utiliser une bibliothèque C++ directement (surtout qu'en plus y'en a des bien mieux).

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 125
    Par défaut
    oui loufoque mais dans la mesure ou il en a plusieurs et que je ne vois pas le code je me dit que potentielement il compile peut etre dans une variable regex_t
    puis tente la copie apres. et reutilise la meme struct pour la compilation suivante ... ce qui serait la cause de son meli-melo.

    enfin ce serait peut etre plus simple d avoir un tableau de regex_t et compiler les expressions directement dans ce tableau plutot que de faire des copies

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 34
    Par défaut
    ( euh , moi les pointeurs faut y aller doucement) ...

    voilà comment ça se presente

    ->original
    regex_t preg;
    err = regcomp (&preg,reg_exp, REG_EXTENDED);

    -> avec modif pour stocker le resultat
    regex_t compCible[200];

    err = regcomp (&compCible[numLin],liste[numLin].cible, REG_EXTENDED);

  14. #14
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Ça parait bon.
    Fais un exemple minimal réduit qui compile et démontre le problème.

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 34
    Par défaut
    ... j'ai pas eu le temps de regarder l'affaire de plus prés (trop de boulot ...)

    Qu'est ce que vous entendez par plus rapide que POSIX, et plus de fonctionnalités?

  16. #16
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    J'entends exactement ce que ça veut dire.

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 34
    Par défaut
    Est-ce que les syntaxes sont compatibles ?
    Tu me conseillerais quoi si je dois changer ?

  18. #18
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Ben y'a regex dans TR1, inclus dans le brouillon de C++09, qui vient de boost.

Discussions similaires

  1. [JTree] comment y stocker les objets ?
    Par calogerogigante dans le forum Débuter
    Réponses: 12
    Dernier message: 16/08/2008, 20h39
  2. Créer un ficher pour stocker les informations
    Par b_steph_2 dans le forum C++
    Réponses: 3
    Dernier message: 10/11/2005, 10h08
  3. [Regex]Répurer plusieurs motifs
    Par gege2061 dans le forum Langage
    Réponses: 2
    Dernier message: 25/10/2005, 15h56
  4. [WebForms][Web.config] Stocker les chaine de connexion
    Par bossun dans le forum Général Dotnet
    Réponses: 15
    Dernier message: 19/08/2005, 15h34
  5. [JDBC] Stocker les résultats d'une requête
    Par etiennegaloup dans le forum JDBC
    Réponses: 9
    Dernier message: 26/07/2005, 18h18

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