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 :

[C++] Tableau de pointeurs de méthode ?


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 45
    Points : 34
    Points
    34
    Par défaut [C++] Tableau de pointeurs de méthode ?
    Bonjour à tous,

    Voici mon petit problème du moment. J'ai une 50 aine de fonctions différentes, dont le nom varie uniquement par un numéro. Je dois appeler l'une d'entre elles en fonction d'une valeur entière. Je pourrais utiliser un super switch mais ca me semble un peu peu barbare et long à coder.

    N'y aurait-il pas moyen de stocker les adresses des fonctions dans un tableau et d'y accéder via la valeur entière que je possède ?

    Ou alors, n'existerait-il pas une autre solution ?

    D'avance je vous remercie.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef void (*FuncType)(); // A adapter selon le prototype de tes fonctions
     
    std::map<int, FuncType> Fonctions;
     
    Fonctions[1] = &Fonction1;
    ...
    Fonctions[36] = &Fonction36;
     
    int i = FonctionId;
    Fonctions[Id]();
    Si tes indices de fonction vont de 0 à N, tu peux aussi utiliser un simple tableau au lieu d'une std::map.

  3. #3
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Heu... pourquoi utiliser une map et pas un tout bête vector ?

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 45
    Points : 34
    Points
    34
    Par défaut
    Si tes indices de fonction vont de 0 à N, tu peux aussi utiliser un simple tableau au lieu d'une std::map.
    a-t-il dit ...

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 45
    Points : 34
    Points
    34
    Par défaut
    Re bonjour à tou !

    J'ai un petit soucis concernant la déclaration du pointeur vers mes fonctions.

    La classe dans laquelle je travaille est "SyntaxicAnalyser"

    et le prototype de mes fonctions à stocker dont je veux stocker l'adresse dans un tableau est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void SyntaxicAnalyser::semanticRoutineXX() ;
    Pourriez-vous m'expliquer à quoi correspond chaque partie du typedef :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef void ( *FuncType) () ;
    pour que je puisse l'adapter à mes besoins ?

    Merci d'avance

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Attention aux fonctions membres, leur type est différent.

    Donc, si ta fonction est de type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void SyntaxicAnalyser::semanticRoutineXX();
    On pourra faire le typedef suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef void (SyntaxicAnalyser::*FuncType)();
    De manière générale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    type_retour Classe::Fonction(type_arg1, type_arg2, ...);
     
    typedef type_retour (Classe::*FuncType)(type_arg1, type_arg2, ...);

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 45
    Points : 34
    Points
    34
    Par défaut
    Voilà, j'ai trouvé un typedef qui fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef void (SyntaxicAnalyser::*RS ) () ;
    La création de mon tableau se passe bien aussi. Il ne me reste plus qu'à récupérer l'adresse et effectuer l'appel ... (YN)


  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Atention pour le stockage et l'appel, comme c'est une fonction membre la syntaxe sera légèrement différente, et surtout il te faidra une instance de la classe pour appeler la fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Fonctions[n] = &SyntaxicAnalyser::semanticRoutineXX;
     
    SyntaxicAnalyser MonInstance;
    (MonInstance.*Fonctions[n])();

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 45
    Points : 34
    Points
    34
    Par défaut
    J'ai déclaré mon tableau comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ptrRS rsTab[DERIVNBR - 1] ;
    J'y place les adresses ainsi (c'est barbare mais j'vois pas d'autre moyen) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    rsTab[ 0] = &SyntaxicAnalyser::semanticRoutine0  ;
    rsTab[ 1] = &SyntaxicAnalyser::semanticRoutine1  ;
    rsTab[ 2] = &SyntaxicAnalyser::semanticRoutine2  ;
    rsTab[ 3] = &SyntaxicAnalyser::semanticRoutine3  ;
    L'appel aux méthodes s'effectue au sein de la classe ... comment puis-je le réaliser ?

    J'ai essayé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *rsTab[lastDrvIdx] () ;
    Mais il rouspète (must use .* or ->* to call pointer to member function)

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 45
    Points : 34
    Points
    34
    Par défaut
    Voilà, en réfléchissant un peu j'ai trouvé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (this->*rsTab[lastDrvIdx]) () ;
    Mais l'appel débouche sur un "segmentation fault".

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ton code est tout à fait correct, pour le plantage maintenant il faut faire un peu de debogage, genre vérifier l'indice, etc...

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 45
    Points : 34
    Points
    34
    Par défaut
    Oui le problème ne vient pas de l'appel mais d'autre part ... j'investigue !

    (Je vais considérer le problème comme résolu ... Merci beaucoup à toi )

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 45
    Points : 34
    Points
    34
    Par défaut
    Je pense voir d'où vient le problème mais ne vois pas comment le résoudre.

    La segmentation fault a lieu lorsque dans ma procédure appelée via son adresse récupérée dans le tableau, j'essaie d'accéder à une des variables de ma classe.

    Je n'vois pas pourquoi ca s'passe ainsi ...

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 45
    Points : 34
    Points
    34
    Par défaut
    Que j'suis bééét' !

    J'ai déclaré un tableau trop petit d'une unité ! :/

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

Discussions similaires

  1. Tableau de pointeurs sur objets
    Par bassim dans le forum C++
    Réponses: 11
    Dernier message: 13/12/2005, 19h45
  2. [GCC] Tableau de pointeurs pour accès multiples en asm
    Par Flo. dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 12/12/2005, 08h47
  3. tableau de pointeurs
    Par seal3 dans le forum C++
    Réponses: 7
    Dernier message: 01/11/2005, 20h51
  4. Tableau de pointeurs de fonctions
    Par Alp dans le forum C++
    Réponses: 7
    Dernier message: 29/10/2005, 13h19
  5. Pointeur de méthode
    Par John Fullspeed dans le forum Langage
    Réponses: 3
    Dernier message: 24/09/2004, 16h04

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