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 :

pointeur de fonction


Sujet :

C++

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut pointeur de fonction
    Bonjour, j'ai un soucis sur un pointeur de fonction. Voici mon code pour expliquer mon problème (la balise CODE ne marche pas sur mon PC...)

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    class A
    {
      private :
     
      int * ordi;     // les 6 cases du camp de l'ordinateur
      int * hum;      // les 6 cases du camp de l'humain
      int * ordi_hum; // les 6 cases du camp de l'ordinateur suivies des 6 cases du camp de l'humain
     
      public :
     
      int nbpionordinateur(void);
      int nbpionhumain(void);
    + d'autres fonctions
    }
     
    ordi_hum est un tableau à 12 éléments, et
     
    ordi=&ordi_hum[0];
    hum=&ordi_hum[6];
     
    class B
    {
      A a;
      il y a d'autres champs
     
      public :
      int toto(void);
      + d'autres fonctions
    }
     
    A la fin de mon fichier B.h j'ai ceci :
    typedef int (*nbpionsjoueur)(void);
     
    voici mon problème : dans mon fichier b.cpp : 
     
    Etat Partie::Jouer(Joueur jou,int n)
    {
     Joueur joueur1, joueur2;
     int * camp1, * camp2;
     nbpionsjoueur nbpionsjoueur1, nbpionsjoueur2;
     int numcase[6]; 
     int i,sum=0,sem,nbgraines;
     
     if(jou==ORDINATEUR)
     {
       joueur1=ORDINATEUR;
       joueur2=HUMAIN;
       camp1=moncale.getcampordi();
       camp2=moncale.getcamphum();
       nbpionsjoueur1 = a.nbpionordinateur();  // ici ca plante : comment faire un pointeur de fonctions ??
       nbpionsjoueur2 = a.nbpionhumain();
     }
     else
     {
       joueur1=HUMAIN;
       joueur2=ORDINATEUR;
       camp1=moncale.getcamphum();
       camp2=moncale.getcampordi();
       nbpionsjoueur1 = a.nbpionhumain();
       nbpionsjoueur2 = a.nbpionordinateur();
     }
     
    blabla
    }
    Merci d'avance et excusez-moi encore du fait que la balise CODE ne marche pas...

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Il faut faire un type "pointeur de fonction membre" ou bien pointer vers des fonctions statiques.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Salut,
    peux-tu s'il te plait me donner un exemple de type pointeur de fonction membre ?

    Merci d'avance

  4. #4
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int (MaClasse::*)(char,float)
    est le type d'un pointeur d'une fonction membre de MaClasse, qui retourne un entier et qui prend en argument un char et un float.

  5. #5
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Si tu veux définir un nom de type pour désigner un tel pointeur de fonction membre, il te suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef int (MaClasse::*FctMembreMaClasse)(char,float);
    Et ainsi, le type "FctMembreMaClasse" désigne un pointeur vers une fonction membre du type donné dans mon post précédent.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Salut,
    merci de tes exemples. J'avoue que je n'ai jamais vu cette syntaxe.
    Je vais l'essayer ce soir !

    Merci encore

  7. #7
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 294
    Billets dans le blog
    2
    Par défaut
    Hum, si je puis me permettre une remarque, j'ai bien l'impression que tu te compliques la vie. J'imagine que c'est un exercice (l'Awale est un classique), mais ça m'étonnerais que l'utilisation de pointeurs de fonctions soit une contrainte.

    En c++, on utilise les pointeurs de fonctions dans des cas très précis, et assez rares; et pour tout un tas de raisons, si on peut éviter, on évite.

  8. #8
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Toutefois, afin de rendre tout ça plus simple et agréable, il y a toujours Boost.Function

  9. #9
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Si tu veux un truc qui marche quel que soit le type de la classe, et qui puisse aussi contenir l'objet, et qui marche en fait avec n'importe quel foncteur, il faut utiliser un foncteur polymorphe comme boost::function.

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Citation Envoyé par r0d Voir le message
    Hum, si je puis me permettre une remarque, j'ai bien l'impression que tu te compliques la vie. J'imagine que c'est un exercice (l'Awale est un classique), mais ça m'étonnerais que l'utilisation de pointeurs de fonctions soit une contrainte.

    En c++, on utilise les pointeurs de fonctions dans des cas très précis, et assez rares; et pour tout un tas de raisons, si on peut éviter, on évite.
    Salut, effectivement, je suis en train de coder l'Awale. C'est un projet personnel. L'objectif pour moi étant d'une part de réapprendre le C++ (que j'ai abandonné au profit du C depuis 3 ans) et d'autre part de faire du calcul multi-thread (pour calculer tous les coups possible de l'ordinateur).

    Pourquoi faut-il éviter les pointeurs de fonctions ? En C, je les utilisais assez souvent car ça me rendait de très nombreux services.

    J'ai donc toujours un problème avec mon pointeur de fonction (bien que j'ai appliqué l'aide de Alp). Je mets en pièce jointe mon code. La compilation plante au niveau de la fonction Partie::Jouer(Joueur,int).

    Pouvez-vous m'expliquer s'il vous plait, l'origine de mon problème.

    Pour lancer le code, il suffit d'aller dans le répertoire Others et de faire "make". L'exécutable s'appelle "out".

    Merci encore de votre aide (et de votre patience) !
    Fichiers attachés Fichiers attachés

  11. #11
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 294
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par salseropom Voir le message
    Pourquoi faut-il éviter les pointeurs de fonctions ? En C, je les utilisais assez souvent car ça me rendait de très nombreux services.
    Effectivement, ça peut rendre beaucoup de service. Je les utilise souvent (personnellement, j'utilise boost pour ça), mais en général, j'essaie d'éviter.

    Peut-être que je me trompe, mais je crois que les pointeurs de fonctions, en c++ présentent plusieurs désavantages:
    - C'est relativement compliqué. Souvent on peut faire plus simple.
    - Ça rend la lecture de code plus difficile. Pour moi c'est très important d'avoir un code facile à lire.
    - L'utilisation de pointeurs de fonction est source d'erreurs. Erreurs qui peuvent être difficile à déceler. Et cette remarque est commune à tous les types de pointeurs.
    - Souvent, ça complexifie les relations entre les classes. Ce qui peut entraîner des ambiguïtés dans la conception.

    Ensuite je suis d'accord que dans certains cas c'est une bon choix.

  12. #12
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Utiliser des fonctions comme des objets c'est une des bases de l'Higher-order Programming, et c'est une bonne chose.

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    OK,
    merci de toutes vos précisions.

Discussions similaires

  1. opengl et pointeur de fonction
    Par Oldhar dans le forum C
    Réponses: 5
    Dernier message: 06/11/2003, 23h56
  2. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37
  3. Matrice de pointeurs de fonctions
    Par sebduth dans le forum C
    Réponses: 15
    Dernier message: 18/07/2003, 14h03
  4. [Kylix] Pointeur de fonctions
    Par _dack_ dans le forum EDI
    Réponses: 1
    Dernier message: 03/07/2003, 10h17
  5. pointeur de fonction
    Par kardath dans le forum C
    Réponses: 4
    Dernier message: 28/12/2002, 14h39

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