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 :

Eviter 25 if else


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 95
    Par défaut Eviter 25 if else
    Salut !

    pour lancer des commandes a partir du term, je parse l'entrée dans un buffer et je fais des strcmp a la suite pour savoir a quelle commande sa correspond et quelle fonction lancée.

    mais bon, j'ai une dizaine de commandes donc ca commence a etre moche..

    j'ai eu l'idée de faire 2 tableaux, un avec les noms des commandes et un avec des pointeurs sur fonction

    parcourir le tableau avec strcmp et lancer la fonction correspondante dans l'indice

    c'est plus classe mais le probleme de cette méthode c'est que les fonctions doivent toutes avoir le meme prototype.. ce qui n'est pas mon cas..

    autres techniques ??
    a+

  2. #2
    Membre éclairé Avatar de miron
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 479
    Par défaut
    Citation Envoyé par lechewal
    Salut !

    pour lancer des commandes a partir du term, je parse l'entrée dans un buffer et je fais des strcmp a la suite pour savoir a quelle commande sa correspond et quelle fonction lancée.

    mais bon, j'ai une dizaine de commandes donc ca commence a etre moche..

    j'ai eu l'idée de faire 2 tableaux, un avec les noms des commandes et un avec des pointeurs sur fonction

    parcourir le tableau avec strcmp et lancer la fonction correspondante dans l'indice

    c'est plus classe mais le probleme de cette méthode c'est que les fonctions doivent toutes avoir le meme prototype.. ce qui n'est pas mon cas..

    autres techniques ??
    a+
    Je supose que si c'aitais possible tu aurais utilisé switch()...

  3. #3
    Membre expérimenté Avatar de damienlann
    Profil pro
    Étudiant
    Inscrit en
    Mai 2005
    Messages
    293
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2005
    Messages : 293
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    le probleme de cette méthode c'est que les fonctions doivent toutes avoir le meme prototype
    pourquoi?

  4. #4
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    Citation Envoyé par damienlann
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    le probleme de cette méthode c'est que les fonctions doivent toutes avoir le meme prototype
    pourquoi?
    parce que pour définir un pointeur de fonction, il faut spécifier le prototype entier de la fonction
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Janvier 2006
    Messages : 74
    Par défaut
    Salut,
    pourquoi pas une structure
    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
     
    typedef struct {
       char CmdName[10];
      void (*pfonc) (arg_list toto);
    } S_cmd;
    const s_cmd[NBER_MAX_CMD] = { { "cmd1", fct1},
                                                    {"cmd2", fct2}};
     
    void launchCmd( char* Mycmd, arg_list *.....
    { 
      int index;
      do
      {
       if (strcmp (s_cmd.Cmd_name ........
        {
          s_cmd.pfonc .......
       }
      while (index < NBER_MAX_CMD)
    }
    et pourquoi pas quelque chose comme ca.....

  6. #6
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Pour le problème des arguments :
    • tu peux utiliser des fonctions à nombres variables de paramètre (les pointeurs de fonction recevront donc un paramètre de type va_list)
    • Un tableau de pointeur de type void
    • Une union

  7. #7
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Si tu veux utiliser switch, tu peux avoir un tableau de commandes dont l'indice correspond à une valeur d'enum
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    enum {
      COMMANDE1 = 0,
      COMMANDE2,
      /* */
      COMMANDEN
    };
    #define NB_COMMANDES (COMMANDEN + 1)
     
    static const char * tab_commandes[NB_COMMANDES] = {
      "commande1",
      "commande2",
      /*... */
      "commanden"
    };
    Apres, il faut rechercher le commande fournie dans le tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    for (k = 0, num_commande == -1; k < NB_COMMANDES; k++) {
       if (!strcmp(commande, tab_commandes[k]))
          num_commande = k;
    }
     
    switch (num_commande) {
      case COMMANDE1 : /* */break;
      case COMMANDE2 : /* */break;
      /* */
      case COMMANDEN : /* */break;
      default : /* commande incorrecte */
    }

    Mais bon
    C'est un peu plus le bordel qu'une serie de if(!strcmp())

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par lechewal
    pour lancer des commandes a partir du term, je parse l'entrée dans un buffer et je fais des strcmp a la suite pour savoir a quelle commande sa correspond et quelle fonction lancée.

    mais bon, j'ai une dizaine de commandes donc ca commence a etre moche..
    <...>
    autres techniques ??
    tokeniser la commande sous la forme d'un tableau de pointeur sur char et d'un compteur de tokens : int argc, char **argv

    forcer la commande (argv[0]) en minuscule.
    chercher la commande dans un tableau dont les éléments contiennent :

    - la commande en minuscules
    - l'adresse de la fonction à appeler

    Le prototype des fonctions est unique est évidemment (air connu)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int f (int argc, char **argv);
    personellement, j'ajoute un contexte utilisateur, ça évite les immondes globales...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int f (int argc, char **argv, void *p_user);
    appeler la fonction correspondante avec les paramètres qui vont bien.

    Exemple d'implémentation (un peu 'avancé', désolé...)

    http://emmanuel-delahaye.developpez.com/clib.htm
    Module CI (Command Interpretor)

Discussions similaires

  1. Gerer beaucoup d'option en evitant else if
    Par jayfaze dans le forum C
    Réponses: 15
    Dernier message: 18/11/2007, 23h19
  2. Encodage de caracteres: eviter 81, 8D, 8F, 90, 9D ->
    Par Fladnag dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 27/04/2004, 11h17
  3. Pb affichage avec un PaintBox (pour eviter scintillement)
    Par juan64 dans le forum C++Builder
    Réponses: 7
    Dernier message: 08/04/2004, 09h21
  4. [opengl] Comment eviter l'ordre de faces ?
    Par :GREG: dans le forum OpenGL
    Réponses: 3
    Dernier message: 02/03/2004, 19h14
  5. Eviter deux nombres identiques dans un tirage aléatoire
    Par moon tiger dans le forum Pascal
    Réponses: 5
    Dernier message: 25/11/2002, 09h57

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