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 du Club

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

    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Points : 69
    Points
    69
    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 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 128
    Points : 33 057
    Points
    33 057
    Billets dans le blog
    4
    Par défaut
    Salut,

    tu as essayé Spr.fonction = &(Spr.fonction1); ?

  3. #3
    Membre du Club

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

    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Points : 69
    Points
    69
    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 sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 196
    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 196
    Points : 17 165
    Points
    17 165
    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 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 128
    Points : 33 057
    Points
    33 057
    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

  6. #6
    Membre du Club

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

    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Points : 69
    Points
    69
    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
    Points : 3 159
    Points
    3 159
    Par défaut
    Dommage de pas utiliser std::function :p

  8. #8
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 196
    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 196
    Points : 17 165
    Points
    17 165
    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