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 :

Probleme pointeur de fonction dans une structure


Sujet :

C++

  1. #1
    Membre actif

    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    38
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Par d�faut Probleme pointeur de fonction dans une structure
    bonjour, je programme en C en loisir a un niveau d�butant, et je me suis heurt� a un probl�me:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    struct SPRITE
     
    { int (*fonction)(int,int) ;
     
       int fonction1(int a,int b){return a+b;}
       int fonction2(int a,int b)(return a*b;}
    } Spr;
    et je voudrais donner a l adresse de fonction soit la valeur de fonction1, soit la valeur de fonction 2 en dehors de la structure.
    normalement on devrait taper Spr.fonction=Spr.fonction1 mais �a ne marche pas !!!

    comment initialiser fonction ? merci d avance.

    (nb excusez la mise en forme je ne sais pas bien utiliser l'�diteur)

  2. #2
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Salut,

    tu as essay� Spr.fonction = &(Spr.fonction1); ?
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  3. #3
    Membre actif

    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    38
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Par d�faut
    �a marche pas malheureusement...

    error: ISO C++ forbids taking the address of a bound member function to form a pointer to member function. Say '&SPRITE::fonction1' [-fpermissive]|

    "cannot convert 'int (SPRITE::*)(int,int)' to 'int(*)(int,int) in assignement

  4. #4
    Expert �minent

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par d�faut
    ah, mais c'est un autre probl�me.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    struct SPRITE{
     int (*fonction)(int,int) ;
     
    int fonction1(int a,int b){return a+b;}
    int fonction2(int a,int b)(return a*b;}
    };
    SPRITE::fonction est une int (*)(int, int). c'est � dire un pointeur vers une fonction libre prenant deux int et retournant un int
    Tandis que SPRITE::fonction1 est une int (SPRITE::*)(int, int), c'est � dire une fonction de SPRITE, retournant prenant deux int et retournant un int.

    Quant � Spr.fonction1, c'est le membre fonction1 de Spr, objet de la classe SPRITE. &(Spr.fonction1) est l'adresse de ce membre, c'est � dire SPRITE::fonction1.

    Il faudrait �crire:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    struct SPRITE{
        int (SPRITE::*fonction) const (int,int);
     
        int fonction1(int a,int b) const {return a+b;}
        int fonction2(int a,int b) const (return a*b;}
     
        SPRITE(bool summed) : fonction(summed ? fonction1 : fonction2) {}
    };
    ou bien
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    struct SPRITE{
        int (*fonction) const (int,int);
     
        static int fonction1(int a,int b) {return a+b;}
        static int fonction2(int a,int b) (return a*b;}
     
        SPRITE(bool summed) : fonction(summed ? fonction1 : fonction2) {}
    };

  5. #5
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Oui comme l'indique l'erreur plut�t claire
    cannot convert 'int (SPRITE::*)(int,int)' to 'int(*)(int,int)
    Btw, �a s'appelle un pointeur de fonction, fonction membre dans ce cas, et tu auras un nombre de r�sultats assez hallucinants sur ce forum, dans notre FAQ, puis via ton moteur de recherche pr�f�r� qui en parle
    http://cpp.developpez.com/faq/cpp/?p...ur-de-fonction
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  6. #6
    Membre actif

    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    38
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Par d�faut
    OK, merci beaucoup �a marche !!!

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    struct SPRITE
    {
      int (*fonction)(int,int) ;
     
      static int fonction1(int a,int b)
      { return a+b ; }
     
      static int fonction2(int a,int b)
      { return a*b ; }
     
    }Spr;
     
      Spr.fonction=Spr.fonction2;
      printf("ESSAI STRUCT 3*2= %i \n",(*Spr.fonction)(3,2));
    il suffisait de rajouter static.

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par d�faut
    Dommage de pas utiliser std::function :p

  8. #8
    Expert �minent

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par d�faut
    Pourquoi avoir opt� pour static?
    Pourquoi ne pas avoir des fonctions libres (hors de la structure) plutot que des statiques?

Discussions similaires

  1. Liste chainee & fonction dans une structure
    Par problems99 dans le forum D�buter
    R�ponses: 1
    Dernier message: 30/08/2010, 13h07
  2. pointeur de fonction dans une structure
    Par Flow_75 dans le forum C++
    R�ponses: 1
    Dernier message: 27/12/2008, 11h55
  3. adresse d'une fonction dans une structure
    Par VITALTH dans le forum D�buter
    R�ponses: 5
    Dernier message: 22/08/2008, 11h02
  4. probleme appel de fonction dans une DLL
    Par sylvain.cool dans le forum C++
    R�ponses: 12
    Dernier message: 19/06/2008, 17h00
  5. R�ponses: 7
    Dernier message: 04/01/2006, 15h34

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