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++Builder Discussion :

[BCB6]Tableau de pointeurs sur fonctions


Sujet :

C++Builder

  1. #1
    Membre expérimenté Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 340
    Points : 1 576
    Points
    1 576
    Par défaut [BCB6]Tableau de pointeurs sur fonctions
    Bonjour,

    aujourd'hui, exercice grammatical en C++...

    J'ai créé un tableau de pointeurs sur différentes fonctions de même signature:
    Ces fonctions sont du type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void* MaFontion0( int );
    void* MaFonction1( int );
    void* Ma fonction2( int );

    etc...

    Le tableau est déclaré comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void* (*TableFonctions[10])( int );

    Jusque là, ça va, le compilateur digère

    Mais comment dois-je initialiser ce tableau ?
    J'ai essayé toute sorte de syntaxe du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TableFonctions[0] = &Mafonction0;

    Ils sont gentils dans les livres, ils expliquent tout sauf l'essentiel
    @ bientôt...

    Salut & @+ sur 3W!

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Sans doute en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void MaFonction0(int );
    void MaFonction1(int );
    void MaFonction2(int );
     
    void (*TableFonctions[10])(int ) = {MaFonction0, MaFonction1, MaFonction2...};
    A plus !

  3. #3
    Membre expérimenté Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 340
    Points : 1 576
    Points
    1 576
    Par défaut
    Salut Henderson,

    ta réponse est tout à fait juste, mais le problème est que je suis dans une en-tête de classe... et le compilateur refuse d'initialiser un tableau membre d'une classe, dans l'en-tête de la classe.

    Je suis donc obligé de faire cette init dans le constructeur de classe.
    Et c'est là que je n'arrive pas à trouver la grammaire exacte pour faire comprendre au compilo que dans l'élément [0] du tableau, je veux y mettre l'adresse de MaFonction0(), etc...

    Des fois c'est énervant le C++ !
    @ bientôt...

    Salut & @+ sur 3W!

  4. #4
    Membre averti

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Points : 446
    Points
    446
    Par défaut
    Je te propose cette méthode:

    Dans le header:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class TForm1 : public TForm
    {
    __published:	// IDE-managed Components
    private:	// User declarations
    public:		// User declarations
      typedef void (__closure *Functor)(int);
      Functor methods[3];
      void Procedure1(int);
      void Procedure2(int);
      void Procedure3(int);
      __fastcall TForm1(TComponent* Owner);
    };
    Dnas le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
      : TForm(Owner)
    {
    methods[0]=&Procedure1;
    methods[1]=&Procedure2;
    methods[2]=&Procedure3;
     
    }
    Tu as besoin du "__closure" pour partager les fonctions entre classes (obligatoire je crois, impossible de partager des fonctions qui ne sont pas dans des classes)

  5. #5
    Membre expérimenté Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 340
    Points : 1 576
    Points
    1 576
    Par défaut
    Bonjour Patrick,

    J'ai déjà essayé cette syntaxe... sans succès.
    Par contre, il y a un message du compilo, en liaison avec ta réponse:

    Impossible de convertir void (__fastcall (_closure)... en void(*)(...)

    C'est quoi ce "_closure" ?
    @ bientôt...

    Salut & @+ sur 3W!

  6. #6
    Membre averti

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Points : 446
    Points
    446
    Par défaut
    Tes fonctions "void Fonction(int)" DOIVENT appartenir à une classe. Le __closure sert à déclarer que la fonction appartient à une classe. Si tu ne mets pas de __closure dans le type ou que ta méthode n'est pas dans une classe (elle peut toutefois être static), tu ne pourras pas faire de lien.

    Il y a une assez bonne explication (en anglais) sur cet article http://www.codeproject.com/cpp/FastDelegate.asp (cherche "__closure" dans la page).

  7. #7
    Membre expérimenté Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 340
    Points : 1 576
    Points
    1 576
    Par défaut
    Merci Patrick,

    j'ai quelques bouquins sur le C++, mais j'avais jamais lu quelque chose sur ce sujet.
    La solution est effectivement décrite sur le site que tu m'as indiqué.
    Encore Merci.
    @ bientôt...

    Salut & @+ sur 3W!

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

Discussions similaires

  1. Tableau de pointeurs sur fonctions.
    Par JulieCarree dans le forum Débuter
    Réponses: 18
    Dernier message: 29/04/2013, 22h59
  2. Réponses: 4
    Dernier message: 09/01/2013, 15h30
  3. Réponses: 1
    Dernier message: 22/12/2009, 11h40
  4. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37

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