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 :

Pointeur de fonction vs fonction


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 153
    Par défaut Pointeur de fonction vs fonction
    Bonjour,
    Pouvez vous m'expliquer la différence entre l'utilisation des pointeurs de fonction et directement la fonction dans les arguments?


    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
    void test( void func() )
    {
    	func();
    };
     
    void myFun()
    {
    	std::cout << "this is another test" << std::endl;
     
    };
     
    int main()
    {
    	test( myFun );
    	system("pause");
    }
    Par rapport à

    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
    void test( void (*func)() )
    {
    	func();
    };
     
    void myFun()
    {
    	std::cout << "this is another test" << std::endl;
     
    };
     
    int main()
    {
    	test( &myFun );
    	system("pause");
    }

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Dans ce cas précis, il n'y en a pas :
    test( myFun ) = test( &myFun )

    En fait myFun est une fonction qui possède donc une adresse. Lorsque l'on utilise myFun, le compilateur le remplace par son adresse.

    Si en plus, le compilateur voit une paire de parenthèses après le nom de la fonction, il en déduit que c'est un appel à la fonction qu'il faut faire et rajoute le CALL en assembleur. S'il n'y a pas la paire de parenthèses, il en déduit que tu veux juste l'adresse de cette fonction.

    Mais en tout état de cause, myFun = &myFun
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Par défaut
    Pour essayer de te donner un exemple concret de l'utilité des pointeurs sur fonctions.
    (Bon c'est peut-être pas forcément le meilleur mais bon):

    Imaginons que tu as une pile d'éxecution, c'est à dire une liste de commandes à executer.
    Admettons tu as un objet qui a pour fonctions membres toutes les commandes que tu veux exécuter (qui pour l'exemple ont toutes le même type).

    La question est comment remplir ta pile pour que quand tu dépile, tu n'ais plus qu'a éxecuter ta commande?

    C'est simple: ta fonction pour empiler prendra en paramètre un pointeur sur la fonction associée à la commande que tu veux empiler. comme ca quand tu récupère la valeur dans ta pile, t'as juste à lui rajouter les parrenthèses et c'est bon.

    J'espère que j'ais été clair et que ça t'as permit de comprendre un peu mieux l'utilité des pointeurs sur fonction.

  4. #4
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Juste pour faire mon casse pied...
    (Avis perso inside) a priori, il existe des solutions préférable aux pointeurs de fonction (que perso, je n'utilise jamais sauf pour compatibilité avec de fonctions callback en C) : std::function, stratégie, etc.

  5. #5
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Par défaut
    Certes, mais mon exemple était plus un cas d'école qu'une réelle solution. Le but était purement pédagogique.

  6. #6
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Citation Envoyé par 6-MarViN Voir le message
    Certes, mais mon exemple était plus un cas d'école qu'une réelle solution. Le but était purement pédagogique.
    En fait, ma remarque concernait surtout hibou107, je n'avais pas lu ton post. Mais...

    Ta solution est très bien... en C Ce n'est pas très POO (en particulier, on peut avoir accès à l'objet correspondant à la fonction ou pas ?) Typiquement dans ton exemple, on peut empiler directement les objets et appeler les fonctions membres.

  7. #7
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par 6-MarViN Voir le message
    Pour essayer de te donner un exemple concret de l'utilité des pointeurs sur fonctions.
    (Bon c'est peut-être pas forcément le meilleur mais bon):

    Imaginons que tu as une pile d'éxecution, c'est à dire une liste de commandes à executer.
    Admettons tu as un objet qui a pour fonctions membres toutes les commandes que tu veux exécuter (qui pour l'exemple ont toutes le même type).

    La question est comment remplir ta pile pour que quand tu dépile, tu n'ais plus qu'a éxecuter ta commande?

    C'est simple: ta fonction pour empiler prendra en paramètre un pointeur sur la fonction associée à la commande que tu veux empiler. comme ca quand tu récupère la valeur dans ta pile, t'as juste à lui rajouter les parrenthèses et c'est bon.

    J'espère que j'ais été clair et que ça t'as permit de comprendre un peu mieux l'utilité des pointeurs sur fonction.
    Là, j'ai besoin d'un exemple pour comprendre.

    Ca ne me semble pas très kosher


    Citation Envoyé par hibou107 Voir le message
    Oui c'est vrai qu'on peut éviter les pointeurs de fonctions par l'approche orientée objet, mais parfois les pointeurs de fonctions fournissent une solution rapide à des cas simples

    Sinon, ce que j'ai bien compris de l'explication précédente, c'est l'utilisation des pointeurs de fonctions aident à économiser la pile, c'est ça?
    Mon cher ami, sous Windows ou Linux, dans un environnement 32 bits, vous avez 1 Mo de pile qui est réservé par thread. Si vous en êtes à tenter d'économiser quelques octets, c'est que vous avez fait quelque chose de foncièrement mauvais
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  8. #8
    Membre éclairé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Billets dans le blog
    1
    Par défaut
    Sinon, l'exemple super typique d'utilité d'un pointeur de fonction, c'est la bonne vieille fonction qsort du C :
    Elle prend une fonction qui "sait" comment comparer les éléments du tableau à trier.
    Ça permet de bien séparer la partie algorithmique du tri de la définition des données, et du coup d'avoir une fonction de tri complètement générique.
    Evidemment, en C++, il suffit de définir l'opérateur < pour les objets que l'on veut être capable de trier... c'est quand même beaucoup plus élégant.

    Heu... 6-MarViN, je ne comprends rien du tout à
    comme ca quand tu récupère la valeur dans ta pile, t'as juste à lui rajouter les parrenthèses et c'est bon.
    Ça veut dire quoi "rajouter les parenthèses" ?
    Tu codes en assembleur ?
    Je ne vois guère qu'en assembleur où l'on peut "préparer" les arguments sur la pile et faire le CALL après... ou alors il y a un truc qui m'échappe.

    Sinon, mon cher Emmanuel Deloget, j'ai encore en mémoire certains bouts de code destinés à être exécutés sur des plateformes embarquées où le moindre octet compte.
    Avec 512 octets de pile, tu es obligé de faire des trucs cracra...
    Par exemple, quand tu as une fonction foo qui prend en paramètre b,c,d et qui appelle une autre fonction bar qui prend en paramètre a,b,c,d, pour éviter d'empiler 2 fois les paramètres, dans foo, tu empiles a et tu appelles directement bar. Ce genre de truc ne peut se faire qu'en assembleur évidemment...
    hum... je ne suis pas sûr d'être très clair...

  9. #9
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par Captain'Flam Voir le message
    Sinon, mon cher Emmanuel Deloget, j'ai encore en mémoire certains bouts de code destinés à être exécutés sur des plateformes embarquées où le moindre octet compte.
    Avec 512 octets de pile, tu es obligé de faire des trucs cracra...
    Voui ceci dit, avec 512 bytes de pile, tu évites autant que possible le C, ou alors c'est que tu est sur un microcontroller type PIC avec un compilateur C réduit

    512 bytes de pile, sachant que chaque fonction appelée va nécessiter l'empilement de deux pointeurs (IP au moment de l'appel de la fonction et le pointeur de pile), tu réduis très vite tes possibilités. Et si tu te rappelles bien de ce que tu as fait, tu t'es surtout basé sur des globales - justement pour éviter de passer des arguments de fonction sur la pile

    Ceci dit, ce n'est très certainement pas l'environnement de travail du PO. Si tu regardes le titre du forum, tu auras une idée du pourquoi
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

Discussions similaires

  1. probleme pointeur en parametre de fonctions
    Par djidane39 dans le forum Langage
    Réponses: 4
    Dernier message: 18/11/2007, 14h48
  2. [Débutant] Pointeur FILE dans une fonction
    Par Dexter00 dans le forum C
    Réponses: 8
    Dernier message: 29/08/2006, 21h37
  3. passage pointeur NULL dans une fonction
    Par reptils dans le forum C
    Réponses: 4
    Dernier message: 11/05/2006, 23h12
  4. Réponses: 10
    Dernier message: 04/01/2006, 16h57
  5. Réponses: 3
    Dernier message: 28/11/2005, 12h15

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