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

GLUT Discussion :

Pointeur de fonction en paramètre


Sujet :

GLUT

  1. #1
    Membre averti
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    32
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 32
    Par défaut Pointeur de fonction en paramètre
    Bonjour

    J'ai un petit problème avec une fonction d'OpenGL (de la librairie GLUT plus précisement). Il s'agit de la fonction glutMouseFunc() qui permet de spécifier en paramètre la fonction à appeller lorsqu'un bouton de la souris est pressé ou relaché.

    Le prototype de la fonction est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void glutMouseFunc(void (*func)(int button, int state, int x, int y));
    Elle prend donc en argument un pointeur vers une fonction.

    J'aimerais par exemple que lorsque qu'un bouton de la souris est pressé, la fonction move() d'une classe Interaction soit appellée.

    Si ma méthode move() est une méthode statique, je n'ai pas de problème, il me suffit de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glutMouseFunc(Interaction::mouse);
    et cela marche. Mais je n'aimerais pas que ma fonction mouse soit statique et dans ce cas je ne vois pas trop comment faire pour que cela marche. Faut-il utiliser un pointeur de fonction ? Quelqu'un aurait une idée comment faire et aussi m'expliquer pourquoi cela marche en statique mais pas autrement.

    Merci d'avance de votre aide.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    C'est assez simple: tu ne peux pas
    Si les évènements Glut te donnaient la possibilité de faire transiter comme argument un void* (comme les biblios de threads) ce serait l'enfance de l'art d'adapter ça à des foncteurs, voire à tout un nouveau système d'évènement. Mais ici pas le choix, il faut lui donner une bête fonction (une méthode statique n'est jamais qu'une fonction) qui ne pourra donc accéder qu'aux variables statiques de ton application.
    Ce que tu peux faire, c'est placer ton objet cible quelque part en static et rédiger une fonction comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void redirect(int button, int state, int x, int y) {
       tonobjet.mouseFunc(button,state,x,y);
    };
    Beaucoup diront que ce n'est pas une bonne solution, mais il n'y a de toutes façons pas de bonne solution vu la façon dont Glut est conçu (SDL Powaaa!)

  3. #3
    Membre averti
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    32
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 32
    Par défaut
    Ok bon je crois que je fais essayer d'utiliser la SDL. Cela fait un petit moment que je désire m'y mettre. Merci en tous cas pour ta réponse.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Vu que tu as initialement posté ton messages dans la partie C++, je te conseillerais même la SFML, c'est une biblio conçue par un membre du forum. En gros le but est le même que la SDL, mais plus assisté et fait en bon C++ (l'utilisation de biblios C en C++ c'est le mal).
    Le seul problème, parait-il, est qu'elle est moins bonne que la SDL si on s'en sert principalement d'API de fenêtrage pour OpenGL sur certaines plateformes exotiques (ça demande beaucoup de code spécifique à la plateforme pour être au point, ce qui explique que seules les APIs assez anciennes et très supportées le font correctement).

  5. #5
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Salut,

    Tu peux utiliser boost.bind pour ça, ça correspond très bien. L'appel se présentera alors ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glutMouseFunc(boost::bind(&Interaction::Mouse, ptrVersTonObjetInteraction, _1, _2, _3, _4));
    La raison de cette écriture est qu'il y a toujours le paramètre this qui est implicite lors d'un appel de fonction (d'où le binding vers un pointeur vers ton objet).
    Ensuite, les _1, .... correspondent à des placeholders. Ils seront remplacés par la fonction appelante par les bons arguments lors de l'appel.

  6. #6
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 540
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 540
    Par défaut
    Citation Envoyé par Dani3L Voir le message
    Ok bon je crois que je fais essayer d'utiliser la SDL. Cela fait un petit moment que je désire m'y mettre. Merci en tous cas pour ta réponse.
    Mais à quoi la SDL va te servir et qu'est ce que cela va t'apporter de plus si ce n'est alourdir le projet ?
    Si tu peux faire le rendu d'une scène 3d avec tes propres routines Open GL que tu as développées actuellement cela est amplement suffisant ; SDL ne t'apportera rien excepté par exemple pour le réseau et faire un jeu multi joueur.
    Mais perso là-dessus je préfère directement programmer les sockets

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    @IrmatDen: heu, tu te trompes la, boost::bind est fait pour "caster" un appel de méthode en foncteur, pas en pointeur de fonction. Il n'est pas magicien.

    @Mat.M: on peut très bien utiliser SDL comme simple API pour le fenêtrage OpenGL et la gestion de entrées, bref pour la même chose que Glut. D'ailleurs le pack de base sans toutes les biblios annexes ne permet pratiquement rien d'autre.

  8. #8
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Citation Envoyé par zais_ethael Voir le message
    @IrmatDen: heu, tu te trompes la, boost::bind est fait pour "caster" un appel de méthode en foncteur, pas en pointeur de fonction. Il n'est pas magicien.
    Pardon, trop l'habitude de l'utiliser, mais pas avec des libs C (Donc pas avec des pointeurs de fonctions bien sûr, je réfléchirais la prochaine fois...)

Discussions similaires

  1. pointeur de fonction en paramètre d'une fonction
    Par virtual_bug dans le forum C++
    Réponses: 4
    Dernier message: 06/01/2015, 22h36
  2. Pointeurs de fonction membre à paramètres variables!
    Par nixmind dans le forum Langage
    Réponses: 11
    Dernier message: 29/09/2012, 03h12
  3. Réponses: 3
    Dernier message: 22/08/2008, 02h07
  4. Réponses: 8
    Dernier message: 05/07/2007, 13h44
  5. Réponses: 4
    Dernier message: 01/12/2005, 12h33

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