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 :

Callbacks en C++ (GLFW)


Sujet :

C++

  1. #1
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut Callbacks en C++ (GLFW)
    Bonjour .

    Voilà je cherche à utiliser un callback en C++ mais j'ai beaucoup de mal.

    J'ai une classe qui initialise la bibliothèque GLFW (pour l'affichage OpenGL), et je veux lui attribuer un callback :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class MaClasse
    {
    MaClasse ();
    ~MaClasse ();
     
    void AssignerCallback ();
    }
    Et la fonction AssignerCallback :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glfwSetWindowSizeCallback (WindowSizeCallback);
    Et le problème c'est justement cette fonction WindowSizeCallback. J'ai essayé de déclarer private statique la fonction WindowSizeCallback comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static void GLFWCALL WindowSizeCallback (int width, int height);
    Pas d'erreur à la compilation, mais la fonction n'est jamais appelée, donc j'en conclu que ce n'est pas comme ça. J'ai tenté de faire un extern "C" à l'intérieur de la classe mais ça ne fonctionne pas non plus. Je ne veux pas faire de l'héritage (je crois que c'est possible en dérivant des classes,...), et je crois que c'est possible avec boost mais j'ai un peu de mal.

    J'ai essayé, en utilisant boost::function en créant une fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    boost::function <void (int width, int height)> WindowCallback;
    puis une fonction statique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static void GLFWCALL MaFonction (int width, int height) {};
    Et ensuite écrire dans la fonction AssignerCallback :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WindowCallback = &MaFonction;
    glfwSetWindowSizeCallback (WindowCallback);
    Mais évidemment ça ne compile pas :/ : Erreur 1 error C2664: 'glfwSetWindowSizeCallback' : impossible de convertir le paramètre 1 de 'boost::function<Signature>' en 'GLFWwindowsizefun' d:\utilitaires\developpement\visual c++\projets\gamekult project\src\gkp_output.cpp 32



    Bref, je demande donc votre aide. J'en suis sûr qu'il y a une méthode élégante de faire ça avec boost::function (boost::bind ?), mais j'avoue avoir un peu de mal :d.

  2. #2
    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
    Quelle est la définition du type GLFWwindowsizefun ?

    Bref, je demande donc votre aide. J'en suis sûr qu'il y a une méthode élégante de faire ça avec boost::function (boost::bind ?), mais j'avoue avoir un peu de mal :d.
    Je n'en suis pas si sûr.

  3. #3
    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
    Tu semblais bien parti avec ta première solution, d'ailleurs ça compilait. Faudrait plutôt chercher à savoir pourquoi ça ne produisait pas le résultat escompté.

    Pour ce qui est de boost::function, j'ai un gros doute aussi, c'est pas vraiment le genre de trucs compatibles avec les APIs C qui demandent des callbacks.

  4. #4
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    Et en utilisant boost::bind ? Bon je sais pas pourquoi ça marche pas la première solution avec la fonction static. C'est de cette manière qu'on fait ça généralement ?

  5. #5
    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
    Et en utilisant boost::bind ?
    Ca ne t'aidera pas plus, boost::bind c'est très bien pour construire des foncteurs de n'importe quel type à partir de n'importe quoi, mais ce qu'il te faut ici c'est un bon vieux pointeur de fonction.
    Mais passer l'adresse d'une fonction statique qui dispatche éventuellement vers l'instance correspondante, c'est très bien aussi, peut-être juste un peu chiant à faire parfois.

    Pourquoi dis-tu que ta fonction n'est jamais appelée ? Tu as mis un point d'arrêt dedans ? Une sortie quelconque sur la console ou dans un fichier ? Es-tu sûr au moins que ta fenêtre a été redimensionnée (on ne sait jamais ) ?

  6. #6
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    J'ai essayé avec le callback pour les touches, pareil, il n'est pas appelé (je fais un std::cout << "test" dans la fonction, ça me permet vite de voir).

    Fait encore plus étrange, même quand je déclare la fonction callback en dehors de la classe, ça ne marche pas non plus, c'est super étrange... Je parcours le forum de GLFW pour voir....

  7. #7
    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
    std::cout pourrait être redirigé vers un fichier ou vers rien du tout par GLFW, tu ferais mieux de mettre un point d'arrêt ou d'écrire un truc dans un fichier pour vraiment être sûr.

  8. #8
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    En écrivant exit (0) en plus, ça ne fait rien non plus :/.

  9. #9
    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
    Tu n'aurais pas oublié d'initialiser GLFW ? Est-ce que le reste fonctionne ? Si tu reprends un exemple minimal, par exemple à partir d'un tutoriel, ça fait quoi ?

  10. #10
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    Citation Envoyé par Laurent Gomila
    Tu n'aurais pas oublié d'initialiser GLFW ? Est-ce que le reste fonctionne ? Si tu reprends un exemple minimal, par exemple à partir d'un tutoriel, ça fait quoi ?
    Oui je l'ai bien initialisé, et le reste fonctionne parfaitement bien :/...

Discussions similaires

  1. Fonction callback
    Par saibe dans le forum Linux
    Réponses: 4
    Dernier message: 19/01/2012, 10h41
  2. [Débutant] fonction CALLBACK
    Par tlt dans le forum MFC
    Réponses: 2
    Dernier message: 29/10/2004, 16h55
  3. Callback
    Par el_diablos dans le forum Langage
    Réponses: 2
    Dernier message: 09/07/2004, 08h48
  4. Fonction callback dans une classe
    Par julian_ross dans le forum MFC
    Réponses: 8
    Dernier message: 02/03/2004, 11h42
  5. [MFC] Un callback dans des MFC ...
    Par elsargento dans le forum MFC
    Réponses: 3
    Dernier message: 18/02/2004, 16h04

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