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 :

Vaut-il mieux des petites ou une grosse... fonction ?


Sujet :

C

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 88
    Points : 53
    Points
    53
    Par défaut Vaut-il mieux des petites ou une grosse... fonction ?
    Bonjour,

    Je suis sur un code qui doit vérifier une ligne de commande puis la parser pour me la ranger dans un tableau de caractères. En fait cette ligne de commande peut être composée de sous-lignes de commandes séparées par des caractères spéciaux (&;|<>) ex : toto -p; tata -ru && tutu -cv

    Actuellement j'ai codé un automate qui vérifie la syntaxe de la ligne de commande :
    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
     
    int
    automate(char *cde)
    {
        int tabEtat[7][6]={{1,2,0,0,0,0},{2,2,3,4,6,0},{3,2,0,0,0,1},{4,0,0,5,0,0},{5,2,0,0,0,0},{6,2,0,0,7,0},{7,2,0,0,0,0}};
        int etat=1; /* Début de lecture de l'automate */
        int n;
        int i=0;
        int colonne=0;
     
        n=strlen(cde);
     
        while(i<n && etat){
            switch(cde[i]) {
                    case ';' : colonne=2;break;
                    case '|' : colonne=3;break;
                    case '&' : colonne=4;break;
                    case '<' : return 0;
                    case '>' : return 0;
                    default  : colonne=1;break;
            }
            etat=tabEtat[etat-1][colonne];
            i++;
        }
        if(etat==0) return 0;
        return (tabEtat[etat-1][colonne]);
    }
    et là je suis sur le parsing de la ligne une fois que l'automate est ok
    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
     
        char **tab;
        char *buffer;
        char *sep = " &|;<>";
        char *brkt;
     
        int nb=10,i=0,lg;
        tab = malloc (nb * sizeof(char *));
     
        for (buffer=strtok_r(cde,sep,&brkt);buffer;buffer=strtok_r(NULL,sep,&brkt)) 
        {
            lg = strlen (buffer);        
            tab[i] = malloc ( (lg + 1) * sizeof(char) );
            strcpy(tab[i],buffer);
            i++;
        }
    Et je me rends compte que cette fonction ne va pas, puisque je ne sais pas si je viens d'extraire un mot ou une sous-chaine (un mot est séparé d'un autre par un espace, une sous-chaine est séparée d'une autre par &;|< ou >).
    Je dois donc, avant de découper en mots, découper en sous-chaines en parcourant la chaine à la recherche de ces caractères spéciaux.

    Je me demandais alors si je ne devais pas plutôt intégrer ce code dans l'automate, quitte à l'alourdir. Pourtant je pense qu'il vaut mieux avoir plusieurs petites fonctions claires plutôt que des gros pavés ?
    Mais si je veux extraire mes sous-chaines en fonctions des caractères spéciaux tout en conservant ces caractères, je suis obligé de relire la chaine caractère par caractère (je ne peux pas faire de strtok_r) et je l'ai déjà fait avec l'automate...
    Si je le fais dans l'automate et qu'il s'avère que la ligne n'est pas syntaxiquement correcte, j'ai parsé la ligne pour rien et j'ai un code d'automate qui est plus lourd...

    D'après vous, Qu'elle est la meilleure solution ?

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Salut
    Manifestement, tu as un problème de conception.
    Chacun a sa propre méthode pour réfléchir, mais je te conseillerais de faire une pause, passer à autre chose si tu peux, et recommencer à réfléchir à ce problème mais pas devant l'écran.
    J'avoue qu'à la lecture de ton problème je n'ai pas vraiment tout compris, mais j'ai l'impression que tu as commencé à coder sans avoir tout analysé ce qui n'est pas vraiment la bonne méthode.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 88
    Points : 53
    Points
    53
    Par défaut
    J'ai beau tourner le pbl dans tous les sens, je ne sais effectivement pas comment je dois procéder... Tu as raison, je vais m'aérer l'esprit

Discussions similaires

  1. Réponses: 7
    Dernier message: 22/06/2014, 01h01
  2. Réponses: 23
    Dernier message: 04/06/2009, 15h43
  3. Vaut-il mieux des stock options ou une augmentation de salaire ?
    Par clavier12AZQSWX dans le forum Salaires
    Réponses: 17
    Dernier message: 28/05/2009, 16h10
  4. utilisation des variables d'une autre fonction
    Par naim2009 dans le forum Interfaces Graphiques
    Réponses: 6
    Dernier message: 08/01/2009, 10h07
  5. Vaut il mieux cacher ou killer une fenetre
    Par chris81 dans le forum Framework .NET
    Réponses: 7
    Dernier message: 21/11/2007, 15h20

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