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 :

Parametre d'entrée : une fonction!


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 23
    Par défaut Parametre d'entrée : une fonction!
    Je developpe un projet qui utilise la bibliothéque GLut (GL pour opengl).

    Dans cette bibliothéque une fonction a comme paramètre d'entré le nom d'une fonction, pus precisement la declaration de la fonction dans glut.h est de la sorte :
    GLUTAPI void APIENTRY glutDisplayFunc(void (GLUTCALLBACK *func)(void));
    Donc un pointeur sur une fonction.

    Dans un premier temps je n'ai pas eu de probleme, la fonction s'appellais affichage je mettait donc
    glutDisplayFunc(affichage);
    et ca marchais parfaitement!

    Par contre il y a d'autre fonction du même genre que affichage() il y a mouse() ...ect qui utilisent des variables en commun entre eux.
    Comme j'ai dis, en premier temps j'ai tout mis en vrac avec des variables globales et ca marchait parfaitement.

    Maintenant pour rendre le projet plus lisible j'ai mis toute ces fonctions qui utilisaient des variables en commun entre eux dans une classe avec la variable en private, je pense que c'est la bonne solution, mais la j'ai un probleme.

    glutDisplayFonction(affichage);
    ne fonctionne pas, affichage etant une fonction de la classe c'est normal.

    glutDisplayFonction(Aff::affichage); //Aff est ma classe
    ne fonctionne pas à mon grand etonnement et me donne comme message d'erreur :
    error C3867: 'Aff::affichage': function call missing argument list; use '&Aff::affichage' to create a pointer to member

    glutDisplayFonction(A.affichage); //A etant mon objet crée dans le main
    ne fonctionne pas non plus et me donne le même message d'erreur.

    Je ne vois pas quoi faire à l'aiiiiiiiide!!!
    Et merci d'avance

  2. #2
    Membre émérite

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634

  3. #3
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 23
    Par défaut

    Oh super..
    /me offre un chocolat au modérateur

    J'ai cherché dans la fac mais j'arrivais pas à bien formuler ma recherche.

  4. #4
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 23
    Par défaut
    Bon j'ai encore besoin d'un peu d'aide.

    dans la reponse de la faq on me dit de crée une nouvelle fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    static DWORD WINAPI StaticThreadFunc( void *Param ) 
    { 
            MaClasse* Obj = reinterpret_cast<MaClasse*>( Param ); 
            return Obj->ThreadFunc(); 
    }
    J'imagine que DWORD est un parametre de sortie.
    Mais aucune idée par rapport à WINAPI !!

    J'ai donc mis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    static void Staticaffichage( void *Param ) 
    { 
    	Aff* Obj = reinterpret_cast<Aff*>( Param ); 
    	return Obj->affichage(); 
    }
    mais le problème persiste.

    error C2664: 'glutDisplayFunc' : cannot convert parameter 1 from 'void (__cdecl *)(void *)' to 'void (__cdecl *)(void)'

    [Balises CODE rajoutées par Fiquet, merci d'y penser la prochaine fois]

  5. #5
    Membre émérite

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Par défaut
    Attention le code de la FAQ n'est qu'un exemple avec l'API Windows. Glut ne demande pas une fonction avec un paramètre void*.

    En fait l'erreur de ton compilateur est assez explicite. Tu dois lui passer une fonction sans paramètre (void), et pas une function avec un pointeur de void comme paramètre.

  6. #6
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 23
    Par défaut
    Donc si je comprend bien...

    glutdisplay fonction veut comme parametre d'entrée quelque chose de la forme

    void (__cdecl *)(void)

    Je modifie donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    static void Staticaffichage( void *Param ) 
    { 
    	Aff* Obj = reinterpret_cast<Aff*>( Param ); 
    	return Obj->affichage(); 
    }
    en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    static void Staticaffichage( void ) 
    { 
    	Aff* Obj = reinterpret_cast<Aff*>( ); 
    	return Obj->affichage(); 
    }

  7. #7
    Membre émérite

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Par défaut


    Le code à l'intérieur de la fonction dépend de ce que tu veux faire. En fait tu ne pourras pas utiliser ton objet ici comme le code de la FAQ, car Glut ne permet pas de passer un paramètre dans la fonction, puisqu'il attend un void (__cdecl *)(void).

    Il faut maintenant voir comment tu veux faire ça, c'est au niveau de la conception. Peut-être celà te suffit de faire un traitement des valeurs statiques.

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    GLUT n'est pas vraiment faite pour être utilisée directement avec du code C++ (des classes et tout le tsointsoin). Il faudra ruser un peu plus que ça pour faire quelque chose de propre.

  9. #9
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 23
    Par défaut
    Merci d'avoir édité mes messages pour le code! je n'avais pas fais attention.

    Bon apres avoir passé la journée à essayer sans succes, je laisse tombé ce n'est pas du tout le sujet de mon stage et c'est dommage de perdre du temps avec ca!
    Je vais tout remetre dans le fichier principal avec des varibles globales

    Merci pour votre participation, je vous reverais à ma prochaine question sur ce tres bon forum.

  10. #10
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Par défaut La même, 1 an après
    Mais c'est pas du tout résolu, tout ça !
    En tout cas je suis content que ce problème existe ailleurs que chez moi.

    Y a un truc que je ne comprends pas : comment utiliser des information non-statiques dans la fonction qu'on fournit à GLUT sachant que cette fonction est statique ?!
    Je me dit que peut être ça a un rapport avec reinterpret_cast<Obj*> mais c'est bien la première fois que je vois cette ligne de code !

    Et puis ...
    Citation Envoyé par Laurent Gomila
    GLUT n'est pas vraiment faite pour être utilisée directement avec du code C++ (des classes et tout le tsointsoin). Il faudra ruser un peu plus que ça pour faire quelque chose de propre.
    T'as une idée de la ruse en question ? Parce que moi ça m'intéresse grandement.

    Merci

  11. #11
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    La ruse serait pour moi de ne pas utiliser GLUT mais directement les API systeme. wgl windows / agl mac

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Y a pas 50 moyens d'accéder à une instance particulière dans une fonction statique : soit on peut la passer en paramètre (pas le cas ici), soit elle a une portée plus grande (statique dans la classe, voire globale).

    Après si on veut vraiment faire un truc propre, on peut créer une classe qui fera l'interface entre GLUT et nos classes. Du genre on enregistre nos instances auprès de cette classe, cette dernière se chargeant ensuite de dispatcher les appels.

  13. #13
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Par défaut
    Citation Envoyé par Laurent Gomila
    ...soit elle a une portée plus grande (statique dans la classe, voire globale).
    Mais si elle est statique, elle ne peut pas accéder à des instances non statiques de la classe.
    Citation Envoyé par Laurent Gomila
    Après si on veut vraiment faire un truc propre, on peut créer une classe qui fera l'interface entre GLUT et nos classes. Du genre on enregistre nos instances auprès de cette classe, cette dernière se chargeant ensuite de dispatcher les appels.
    Oui, mais vu que Glut n'accepte pas de méthodes non statique de classe, dans sa fonction glutMouseFunc, je ne vois pas comment elle peut dialoguer avec notre classe interface !

  14. #14
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    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
    class InputListener
    {
    public :
     
        virtual void OnMouseMove(int X, int Y) {}
    };
     
    class InputManager
    {
    public :
     
        static void Init()
        {
            glutMouseFunc(&InputManager::MouseFunc);
        }
     
        static void AddListener(InputListener* Listener)
        {
            if (Listener)
                Listeners.insert(Listener);
        }
     
    private :
     
        static void MouseFunc(int X, int Y)
        {
            for (std::set<Listener*>::iterator i = Listeners.begin(); i != Listeners.end(); ++i)
            {
                (*i)->OnMouseMove(X, Y);
            }
        }
     
        static std::set<Listener*> Listeners;
    };
     
    class MyListener : public InputListener
    {
        virtual void OnMouseMove(int X, int Y)
        {
            ...
        }
    };
     
    int main()
    {
        InputManager::Init();
     
        MyListener Listener;
        InputManager::AddListener(&Listener);
     
        ...
     
        return 0;
    }
    C'est certainement pas la meilleure implémentation, mais c'est pour donner l'idée.

  15. #15
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Par défaut
    Je te remercie de te décarcasser pour m'aider à résoudre mon problème, mais tu viens justement de m'aiguiller vers la solution ici.

    Merci !

    Martin

  16. #16
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Mince j'avais pas remarqué que c'était toi

    Bon ben en espérant que mon code serve à quelqu'un d'autre.

    N'oublie pas de marquer ce sujet

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

Discussions similaires

  1. Passage de paramètres entre une fonction et une interface graphique
    Par ninja_3 dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 29/05/2007, 11h37
  2. Passage de parametre facultatif a une fonction
    Par Rakken dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 06/04/2007, 13h06
  3. Conflit entre une fonction Delphi et une API ?
    Par [ZiP] dans le forum Delphi
    Réponses: 2
    Dernier message: 23/01/2007, 10h14
  4. [débutant] mettre un parametre optionnel dans une fonction
    Par maximenet dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 03/08/2006, 16h08
  5. Réponses: 11
    Dernier message: 05/04/2006, 11h50

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