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 :

Pointeur de fonction, comment passer une fonction en paramètre d'une autre fonction


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 24
    Par défaut Pointeur de fonction, comment passer une fonction en paramètre d'une autre fonction
    Le programme sur lequel je travail est constitué d'un grand nombre de fonction (dans mon exemple je les nomme : fonction1, fonction2, etc..., elle renvoi un AnsiString) et à chaque fois que j'utilise l'une d'entre elle je dois calculer leurs paramètres et faire d'autre opération.
    Si j'écris ces opérations à l'appel chaque fonction, ça va me faire un code super long et répétitif.
    Comme ces opérations et calcul sont les mêmes pour chaque fonctions, j'ai envi de les mettre dans une fonction qui les ferait et appellerai la fonction qu'on lui à passé en paramètre (fonction1 ou fonction2 ou ...).


    J'ai cherché du coté des pointeurs de fonction et j'ai trouvé pas mal de chose, mais je n'ai rien réussit à faire marché. Je n'ai pas tout compris non plus, je suis débutant en pointeur.

    Voici, de façon simplifié, ce que je souhaite faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    "fonctionN" = &fonction1;  //pointeur sur la fonction qui sera passer en paramètre
    RemplirCase( a, b, "fonctionN");
     
    //----------------------------------
    void RemplirCase(int a,int b, "fonctionN")
    {
    offset=a+b;
    AnsiString data = fonctionN(offset,1);
    }
    j'ai essayé ceci pour créer le pointeur :

    .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AnsiString __fastcall Fonction1(int offset);
    .cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       AnsiString ( *pFonction1)(int) = NULL;
    pFonction1 = &Fonction1;
    Mais j'ai une erreur à la dernière ligne : E2034 Impossible de convertir 'AnsiString (_fastcall * (_closure )(int))(int)' en 'AnsiString (*)(int)

    Quelqu'un pourrait-il m'aider?

    Merci.

  2. #2
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Je n'ai pas C++ Builder sous la main, mais voilà quelquechose qui devrai fonctionner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    //Déclaration du prototype de ta fonction qui sera passée en paramètre
    typedef void (__closure *MyParameterFunction) ( int a, int b ) ;
    //Déclaration d'une fonction dont un paramètre est un pointeur vers ta fonction déclarée précedement
    AnsiString MyFunction( int i, MyParameterFunction aFunction ) ;
    et dans le cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    AnsiString MyFunction( int i, MyParameterFunction aFunction )
    {
      int tmpInt = 10;
      int tmpInt2 = 10 * i ;
      aFunction( tmpInt , tmpInt2  ) ; // appel a ta fonction
    }

  3. #3
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Un exemple sera peut etre plus explicatif :

    dans le *.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //déclaration du prototype de ta fonction
    typedef int (__closure *Operation) ( int, int ) ; 
     
    class TForm1 : public TForm
    {
    //[...]
    private:
       int Addition( int x, int y ) ; 
       int Multiplication( int x, int y ) ;
       void ExecuteFonction( int i, int j, Operation aFunction ) ; 
    };
    dans le *.cpp
    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
    int TForm1::Addition( int x, int y )
    {
      return( x+y ) ;
    }
    //------------------------------------------
    int TForm1::Multiplication( int x, int y )
    {
      return( x*y ) ;
    }
    //------------------------------------------
    void TForm1::ExecuteFonction( int i, int j, Operation aFunction )
    {
    //Execution de la fonction passée en paramètre sans la connaitre a l'avance
      int result = aFunction( i, j );
    //Affichage du résultat.
      ShowMessage( IntToStr( result ));
    }
    A l'exécution, exemple avec deux boutons, chacun faisant appel à la même méthode (ExecuteFunction) mais effectuant 2 actions différentes selon la méthode passée en paramètre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //------------------------------------------
    void __fastcall TForm1::BitBtn1Click(TObject *Sender)
    {
      ExecuteFonction( 10, 10, Addition ) ;
    }
    //---------------------------------------------------
    void __fastcall TForm1::BitBtn2Click(TObject *Sender)
    {
      ExecuteFonction( 10, 10, Multiplication ) ;
    }

  4. #4
    Membre Expert

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Si j'écris ces opérations à l'appel chaque fonction, ça va me faire un code super long et répétitif.
    Comme ces opérations et calcul sont les mêmes pour chaque fonctions, j'ai envi de les mettre dans une fonction qui les ferait et appellerai la fonction qu'on lui à passé en paramètre (fonction1 ou fonction2 ou ...).
    Tu as probablement, au niveau de ton projet, un problème de conception à résoudre !
    Parce que :

    Comme ces opérations et calcul sont les mêmes pour chaque fonctions,
    A mon avis ... il y a un problème bien avant celui de la déclaration d'un pointeur vers méthode (ou vers fonction) !

    A plus !

  5. #5
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 24
    Par défaut
    Merci beaucoup sat83, c'est exactement ce qu'il me fallait.

    @ henderson : En faite mon programme permet de lire et décoder des données contenues dans un fichier, le but est d'afficher ces données dans un tableau en fonction de ce que souhaite voir l'utilisateur.
    Ce fichier est constitué de 15 pages, chaque pages et constitué de 255 fiche contenant des données (un grands nombre ) toutes codées de façon différente.
    Il me faut donc une fonction par donner à décoder.
    Pour faire le décodage mes fonctions ont besoin de connaitre l'emplacement en mémoire des octets à lire, c'est ce que je calcul avant l'exécution de mes fonctions, j'ajoute également des colonnes à mon tableau à ce moment là. Ça ne prend que 10 lignes, mais 10 lignes fois le nombre de données ça fait beaucoup, c'est ce que je souhaite ainsi éviter.

    C'est pour cela que c'est répétitif. Enfin c'est un peut long à expliquer, je ne sais pas si j'ai été clair, mais je n'ai pas trouvé d'autre façon de faire.

  6. #6
    Membre Expert

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    En fait ... tout dépend de l'organisation des données dans chaque fiche parmi les 255 d'une page parmi 15 pages !

    Par exemple, si les fiches reposent sur un même modèle, on peut alors imaginer un tableau de pointeurs vers fonction pour résoudre chaque champ.
    Et dans ce cas, il ne serait plus nécessaire de passer une fonction comme paramètre.
    Ce tableau étant initialisé une fois pour toutes, une simple boucle (pour traiter une fiche) suffirait pour solliciter la bonne fonction pour la bonne donnée.
    Et dans ce cas précis, on pourrait envisager de passer un pointeur vers AinsiString et un pointeur vers int pour passer d'un champ à l'autre ...

    Mais bon ... chacun fait bien comme il veut... du moment que ça fonctionne !

    A plus !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 20/08/2013, 14h38
  2. comment passer un ArrayList comme paramètre d'une méthode
    Par itmak dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 22/11/2008, 10h31
  3. Réponses: 3
    Dernier message: 20/08/2008, 14h22
  4. Réponses: 0
    Dernier message: 14/11/2007, 21h02
  5. [Débutant] Comment passer un fichier en paramètre d'une fonction?
    Par Rires et Chansons dans le forum MATLAB
    Réponses: 4
    Dernier message: 23/10/2007, 21h12

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