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 :

Enlever un switch?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 62
    Par défaut Enlever un switch?
    Bonjour

    J'ai un code du type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    switch(x)
    {
    case 0:
      traitement 0;
      break;
    ...
    case n:
      traitement_n;
    }
    Tous les cas (0, 1, ..., n) sont traités. Je me demandais si ca ne serait pas mieux de faire un tableau de fonctions:

    FONCTION f[n];
    comme ca, connaissant x, je n'ai qu'a faire f[x] au lieu du grand switch. Je pense que ce serait plus rapide a l'exécution. Comme mon n est assez grand, mais j'aimerais avoir une petite idée avant de me lancer la dedans
    Ca ne me dérange pas que le code généré grossise.
    Je pars du principe qu'un switch est plus lent car il demande un certain nombre de comparaison.
    Qu'en pensez vous?

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Bonsoir
    Je suis favorable personnellement à la solution d'un tableau de pointeur sur fonctions dans cette situation. Non d'ailleurs pour un problème de rapidité d'exécution (si ce n'est pas critique, mais de toute façon je pense que c'est effectivement plus rapide), mais plutôt pour obtenir une structuration et une lisibilité du programme plus grande : chaque traitement se trouve parfaitement localisé dans une fonction ; chaque traitement est traité indépendamment des autres; chaque traitement est parfaitement identifiable, quel que soit sa complexité; sa lisibilité n'est plus affecté par la complexité du traitement des autres cas.
    Ca ne me dérange pas que le code généré grossise
    Je ne crois même pas que cette solution présente cet inconvénient, au contraire.
    Comme mon n est assez grand,
    Une raison supplémentaire, ce switch va devenir illisible
    C'est une solution que j'adopterais très probablement

  3. #3
    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
    Par défaut
    Oui, c'est surement le mieux.
    C'est beaucoup plus simple, lisible et facilement extensible..
    "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

  4. #4
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    pour faire un tableau de pointeur sur fonction il faudrait encore que les n fonctions aient la meme signature ou au minimum chacune recevant un nombre d'argument equivalent ou alors ca risque d'etre un peu plus complexe...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 62
    Par défaut
    Merci les gars, je vais faire ca... Ya pas de pb a propos de la signature

  6. #6
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Merci les gars, je vais faire ca... Ya pas de pb a propos de la signature
    Essai de poser du code dans le cas ou tu bloques

  7. #7
    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 Re: Enlever un switch?
    Citation Envoyé par socrate
    J'ai un code du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    switch(x)
    {
    case 0:
      traitement 0;
      break;
    ...
    case n:
      traitement_n;
    }
    Tous les cas (0, 1, ..., n) sont traités. Je me demandais si ca ne serait pas mieux de faire un tableau de fonctions:

    FONCTION f[n];
    comme ca, connaissant x, je n'ai qu'a faire f[x] au lieu du grand switch. Je pense que ce serait plus rapide a l'exécution. Comme mon n est assez grand, mais j'aimerais avoir une petite idée avant de me lancer la dedans
    Ca ne me dérange pas que le code généré grossise.
    Je pars du principe qu'un switch est plus lent car il demande un certain nombre de comparaison.
    Ce serait le pire des cas. Il y a de fortes chances que ce soit plutôt une table de sauts indexés, surtout si les valeurs des 'cases' sont consécutives et classées en ordre croissant. Ca dépend du compilateur.

    Oui, un tableau de fonction est possible si les index sont clairs et ne changent pas, c'est à dire indépendants des specifications externes de l'application...

  8. #8
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Par défaut
    Attention tout de même à vérifier la valeur de l'index dans la cas d'un tableau de fonction. Il faut tester si sa valeur ne dépasse pas la table.

    Dans le cas d'un switch, le poblème ne se pose pas même si la gestion d'un "défault" peut être pertinente (avec une trace si c'est possible).

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 62
    Par défaut
    Je mets ce message pour dire que ca marche bien avec les fonctions virtuelles, je vais donc enlever mon switch. Je mets le code si ca peut intéresser quelqu'un:

    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
     
    #include <iostream>
     
    using namespace std;
     
    class A
    {
      typedef void (A::*FONCTION)();
      static FONCTION fct[];
      virtual void f() {cout << "A::f()" << endl;}
      void g() {cout << "A::g()" << endl;}
    public:
      void test(int n) 
      {
        FONCTION f = fct[n];
        this->f();
      }
    };
     
    A::FONCTION A::fct[] = {&A::f, &A::g};
     
    class B: public A
    {
      virtual void f() {cout << "B::f()" << endl;}
    };
     
    int main()
    {
      A* a = new B();
      a->test(0); // Appel de B::f()
      delete a;
    }

  10. #10
    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
    oublie pas le petit résolu en bas à gauche
    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)

  11. #11
    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
    Par défaut
    Et on a bossé pour un type qui fait du C++ !!!
    "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

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 62
    Par défaut
    J'étais pas courant de la guerre entre le C et le C++
    De toutes facons, c'était pas volontaire

  13. #13
    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
    Par défaut
    Ce n'est pas une guerre loin de là , mais il faut faire attention ,les deux langages se ressemblent mais sont pourtant assez différents, d'où la nécessité de 2 forums.
    "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

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 31/07/2003, 00h35
  2. Enlever tous les M&Mme des enregistrements
    Par marc olivier dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/07/2003, 12h24
  3. Enlever les espaces
    Par Claythest dans le forum Langage
    Réponses: 6
    Dernier message: 03/06/2003, 14h43
  4. Réponses: 6
    Dernier message: 26/01/2003, 13h45
  5. []Enlever 1 an à un objet "Date"
    Par inotna2099 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 30/10/2002, 17h21

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