1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    août 2013
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : août 2013
    Messages : 115
    Points : 46
    Points
    46

    Par défaut adresse d'une fonction

    Bonjour,

    je souhaite récupérer l'adresse d'une fonction j'ai donc fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void direBonjour()
    {
    	std::cout << "Bonjour" << std::endl;
    }
     
    int main(int argc, char const *argv[])
    {
    	cout << "direBonjour : " << direBonjour << endl;
    }
    et quand je lance sur visual studio je récupere bien l'adresse de ma fonction, je suis surpris car j'aurais pensé qu'il aurait fallut mettre &direBonjour (et ca marche également), pouvez vous m'éclairer sur la différence entre direBonjour et &direBonjour car les deux marchent.

    De plus lorsque j'utilise le compilateur gcc sur un terminal windows, celui me renvoie la valeur de 1 pour le meme code, pourquoi?

    merci d'avance pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    Consultant informatique
    Inscrit en
    octobre 2004
    Messages
    10 464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : octobre 2004
    Messages : 10 464
    Points : 22 702
    Points
    22 702

    Par défaut

    Salut,

    Normalement, les deux écritures ( callBack=maFoncton et callBack= & maFonction) font exactement la même chose. Le truc, c'est que tu as souvent besoin (en C, car C++ nous a affranchis de ce besoin grâce à std::function ) de transmettre un callback à une fonction, sous une forme qui serait alors proche de
    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
    typedef void (MonCallBack * )(int, int);
     
    void maFonction( MonCallback cb){
     *(cb).(4,5)
    }
     
    void foo(int i, int j){
        /* blabla*/
    }
    int main(){
        maFonction(&foo);
        /*  ou ou ou*/
        MonCallBack cb = nullptr;
       switch(truc){
           case 1 :
               cb=&multiply;
               break
           case 2 :
               cb=&divide;
               break
           case 3 :
               cb=&add;
               break
           case 4 :
               cb=&substract;
               break;
       }
        foo(cb);
    }
    Et il arrive parfois qu'une syntaxe passe mieux qu'une autre (je ne suis d'ailleurs pas sur de mon exemple)

    Quoi qu'il en soit, à moins d'utiliser une bibliothèque C (auquel cas, tu aurais sans doute intérêt à chercher l'équivalent ou le binding en C++), tu peux allègrement oublier tout cela en C++ moderne: depuis C++11, la transmission d'une fonction comme paramètre à une autre qui se chargera de l'appeler ou le maintient "ensemble" de plusieurs fonctions dans une collection passe par... std::function (et éventuellement std::bind), voir, fait appel au expressions lambda
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    août 2013
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : août 2013
    Messages : 115
    Points : 46
    Points
    46

    Par défaut

    ok merci de ta réponse, j'ai beaucoup de mal à comprendre l'utilité des fonctions callback ou std::function... peux tu me donner un exemple simple ou il est necessaire de les utiliser

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    Consultant informatique
    Inscrit en
    octobre 2004
    Messages
    10 464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : octobre 2004
    Messages : 10 464
    Points : 22 702
    Points
    22 702

    Par défaut

    Il se peut que tu te trouves dans une situation dans laquelle tu va appeler une fonction dont tu sais qu'elle va devoir en appeler une autre, mais que tu souhaites choisir la fonction qui sera effectivement appelée (on va dire "de manière indirecte").

    Dans ce cas, le plus facile est donc de... transmettre directement à la fonction que tu appelles la fonction qui devra être appelée de manière indirecte, comme tu le ferais pour n'importe quel paramètre utilisé par la fonction.

    Je ne sais pas si tu as déjà entendu parler de ce qu'il convient d'appeler un "système de signaux et de slots" (comme celui que l'on utilise dans Qt) ou d'un patron de conception appelé "observateur" (observer, en anglais).

    L'idée est toujours la même dans le sens où tu te retrouves dans une situation dans laquelle tu sais que "quelque chose" pourrait souhaité être tenu au courant du fait que l'une ou l'autre étape de ta logique a été atteinte; sans savoir, a priori, ni s'il y aura effectivement "quelque chose" qui sera intéressé par le fait que l'étape en question a été franchie, ni (encore moins, oserais-je écrire) ce qui devra être entrepris lorsque cette étape sera franchie.

    L'idéal est donc de permettre au développeur de dire "arrivé à tel point, il faut appeler une fonction qui prendra tels paramètres, pour qu'elle s'occupe de '' faire ce qu'il faut'' ". La fonction en question sera appelée "callback", et le moyen dont le développeur dispose pour indiquer effectivement la (ou les) fonction(s) qui devra (devront) être appelée(s) passe, en C, par l'utilisation d'un pointeur de fonction, en C++, par l'utilisation de std::function.

    Quelques exemples d'utilisation :
    • Toutes les bibliothèques permettant de créer des IHM (Qt, WxWidget, autres) : pour permettre à un élément de l'IHM de transmettre "à qui est intéressé" les différents événements qui surviennent à leur niveau
    • Les bibliothèques destinées la gestion des entrées et des sorties, pour permettre de transmettre "à qui de droit" le fait que la souris a été déplacée, que l'on a enfoncé un bouton de la souris ou une touche du clavier
    • les systèmes de "compte à rebours" (timer en anglais) pour indiquer "à qui de droit" que le temps est écoulé
    • ...
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    août 2013
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : août 2013
    Messages : 115
    Points : 46
    Points
    46

    Par défaut

    Ok j'ai compris, merci pour toutes tes infos !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/09/2008, 14h38
  2. adresse d'une fonction dans une structure
    Par VITALTH dans le forum Débuter
    Réponses: 5
    Dernier message: 22/08/2008, 11h02
  3. Réponses: 7
    Dernier message: 30/05/2008, 03h42
  4. Conversion de l'adresse d'une fonction
    Par neerylka dans le forum C++
    Réponses: 2
    Dernier message: 13/09/2007, 09h05
  5. Memoriser l'adresse d'une fonction
    Par Mike91 dans le forum C++
    Réponses: 3
    Dernier message: 23/11/2006, 15h29

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