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 :

j'ai une fonction bizarre..


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 85
    Par défaut j'ai une fonction bizarre..
    Salut!
    Voila je suis en train de décortiquer un code c++, pour en extraire que ce dont j'ai besoin (c'est les libraires VRPN pour la gestion de capteur de réalité virtuelle).
    Comme cette lib n'a aucune reference sur son site, je suis un peu perturbé par certaine fonctions....
    1) Voila, je me retrouve avec une fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void	VRPN_CALLBACK handle_analog (void *userdata, const vrpn_ANALOGCB a){ ..... }
    Je comprends pas pourquoi il y a un VRPN_CALLBACK devant le nom de la fonction.

    2) cette fonction est appellé un peu plus loin comme arguement d'une méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     dev->ana->register_change_handler(dev->name, handle_analog);
    mais ici elle n'a pas de parathèse ni d'arguments...!
    Je vous avous que ça me dépasse
    Est ce que quelqu'un pourrais m'expliquer?
    merci!!

  2. #2
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Par défaut
    Bonjour,

    tu as affaire ici à une fonction callback. Si l'anglais ne te fais pas peur, tu pourras trouver pas mal d'infos à ce sujet ici: http://www.newty.de/fpt/callback.html

    VRPN_CALLBACK est une variable qui doit être définie quelque part dans ton application et qui doit certainement définir des directives de compilation.

    Donc, la fonction handle_analog est une callback. Elle est passée en paramètre, sous forme de pointeur de fonction, à la fonction register_change_handler, c'est pour cela qu'elle ne prend pas de paramètres: c'est juste un pointeur vers la callback qui est passé. Pour plus de précision, tu trouveras tout ce qu'il te faut en faisant une recherche sur "callback" et/ou "pointeur de fonction".

  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
    La fonction handle_analog est ce qu'on appelle une fonction de rappel (callback). Elle est passée en paramètre à register_change_handler, qui s'occupera de la rappeler (d'où le nom) au(x) bon(s) moment(s).

    VRPN_CALLBACK est une macro qui définit une convention d'appel (par exemple __cdecl ou __stdcall). Il est nécessaire que la convention d'appel soit bien fixée lorsqu'on trimballe des fonctions entre plusieurs modules, car si on laisse la convention d'appel par défaut celle-ci peut être différente entre compilos ou entre projets.
    Si tu ne sais pas ce qu'est la convention d'appel, il s'agit en fait de la manière dont la pile va être gérée lors de l'appel de la fonction (qui va empiler les paramètres, de quelle manière, qui va nettoyer la pile à la fin, etc...).

  4. #4
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut
    pour le point deux: tu passe en paramètre de la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    register_change_handler()
    l'adresse de la fonction .
    De cette facon, dans le code de register_change_handler(), on peut utiliser l'adresse de handle_analog(). (Pour l'appeller evideamment)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 85
    Par défaut
    Merci pour vos réponses!
    donc j'ai a peu près compris le principe des fonctions de rappel et des pointeurs de fonctions.
    Il me reste néanmoins des zones à éclaircir...:
    comment cela se fait-il qu'on puisse appeller une fonction par son adresse, sans spécifier ses paramètres?

    Dans mon cas j'aimerais pouvoir utiliser les données qui se trouve dans l'objet vrpn_ANALOGCB a, en dehors de cette fonction
    j'ai essayé de remettre ce code dans mon main, mais ca ne marche pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    vrpn_ANALOGCB a;
    printf("%5.2f", a.channel[0]);
    Bon je sais, je fais quelque chose de stupide en voulant lire une variable qui n'a pas été initialisée du coup c'est normal que ça marche pas... En fait je voudrais comprendre comment ma fonction initalise cette variable


    (La fonction à l'origine est celle-là):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void	VRPN_CALLBACK handle_analog (void *userdata, const vrpn_ANALOGCB a)
    {	printf("%5.2f", a.channel[0]);
    }
    et elle marche bien quand j'appelle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dev->ana->register_change_handler(dev->name, handle_analog);

  6. #6
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Par défaut
    Si on regarde la signature de handle_analog:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void	VRPN_CALLBACK handle_analog (void *userdata, const vrpn_ANALOGCB a)
    on voit que la variable a est passé en paramètre constant (mot clé 'const') ce qui signifie que cette variable ne peut pas être modifiée au sein de cette fonction (ici on a un bon exemple de l'utilité de la sémantique du c++). Ce n'est donc pas handle_analog qui initialise cette variable, mais elle lui est passée en paramètre.

    Là, il faut que tu ailles voir le code de register_change_handler pour voir ce qu'il s'y passe, et en particulier ce qu'il advient du pointeur de fonction sur ta callback.

  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
    comment cela se fait-il qu'on puisse appeller une fonction par son adresse, sans spécifier ses paramètres?
    Je crois qu'il y a un peu de confusion. Voici un équivalent syntaxique qui fonctionne tout aussi bien, mais qui sera peut-être plus clair pour toi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void callback(int x)
    {
    }
     
    void handler(void(*cb)(int))
    {
        // Appel de la callback
        (*cb)(5);
        // cb(5);
    }
     
    // Passage du pointeur vers la callback au handler
    handler(&callback);
    //handler(callback);
    En fait je voudrais comprendre comment ma fonction
    initalise cette variable
    Ben là il faut aller voir son code source, si tu l'as.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 85
    Par défaut
    ok les gars, merci pour vos réponses!
    je vais potasser tout ça...
    et ptetre de retour lundi sur le forum

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

Discussions similaires

  1. bizarre, IE bug dans une fonction
    Par ypomes dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 12/01/2011, 22h25
  2. Récupérer une variable dans une fonction "bizarre"
    Par Fan0u dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 29/04/2009, 15h49
  3. Appel d'une fonction en mode bizarre
    Par zarbiman dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 23/11/2007, 14h35
  4. Résultat bizarre d'une fonction numérique simple
    Par feynman dans le forum Fortran
    Réponses: 9
    Dernier message: 19/11/2007, 22h07

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