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 - Ecriture la plus juste


Sujet :

C

  1. #1
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut Pointeur de fonction - Ecriture la plus juste
    Salut,

    Laquelle des deux écritures est la plus juste ou celle à préférer ? Et pourquoi ?
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef int pf_t ( void );
     
    int foo( void );
     
    int main( void )
    {
    	pf_t *pf_foo;
     
    	pf_foo = &foo;
    	/* OU */
    	pf_foo = foo;
     
    	pf_foo();
    	/* OU */
    	(*pf_foo)();
     
    	return 0;
    }
     
    int foo( void )
    {
    	return 1;
    }
    Merci.
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  2. #2
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    Par défaut
    La plus simple pour des raisons de clareté de lecture.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	pf_t *pf_foo  = foo; 
    	pf_foo();

  3. #3
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par Lucien63 Voir le message
    La plus simple pour des raisons de clareté de lecture.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	pf_t *pf_foo  = foo; 
    	pf_foo();
    Pas d'accord. Pour mon compte, je préfère de beaucoup pour des raisons de clarté : le codage peut laisser supposer au lecteur du code l'existence d'une fonction pf_foo qu'il cherchera vainement, alors que l'autre notation exprime clairement la nature de pf_foo
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  4. #4
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Citation Envoyé par diogene Voir le message
    Pas d'accord. Pour mon compte, je préfère de beaucoup
    +1. Au moins, c'est sans ambiguïté !

    La forme pf_foo() n'est pas la forme originelle.

    C'est juste une tolérance que permet la norme pour raison de simplification mais qui a mon avis a du pertuber pas mal de débutants... et ne les a pas aidé à bien comprendre les pointeurs de fonction.
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  5. #5
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Extrait de mon tutoriel de langage C : Pointer sur une fonction. Je suis d'accord avec Lucien63, mais ça n'est rien de plus qu'un avis personnel.

  6. #6
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Merci 'Melem' pour ce tuto je crois que je vais adopter cette écriture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     pf_foo = ******&*&*&*&foo;
     (******&*&*&*pf_foo)();
    C'est drôle de voir que l'on peut écrire des choses de ce genre , mais en y réfléchissons c'est vrai que puisque le nom de la fonction représente son adresse on pourras déréférencer ce pauvre petit pointeur à l'infini le résultat sera le même ...

    Merci pour vos avis à tous !
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  7. #7
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut
    Perso,je préfère
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    pf_foo = foo;
     
    	pf_foo();
    c'est plus facile à comprendre...
    Toute question technique envoyée en MP ira directement à la poubelle

    Un code ne marchera jamais, il n'a jamais reçu la capacité de se déplacer.
    Inutile donc de dire "ça marche pas", donnez plutôt des informations précises afin de mieux pouvoir vous aider.


    Grand gourou de la -attitude

  8. #8
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par diogene Voir le message
    Pas d'accord. Pour mon compte, je préfère de beaucoup pour des raisons de clarté : le codage peut laisser supposer au lecteur du code l'existence d'une fonction pf_foo qu'il cherchera vainement, alors que l'autre notation exprime clairement la nature de pf_foo
    Pas d'accord :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>
     
    static void aff (void)
    {
       puts ("Hello world");
    }
     
    int main (void)
    {
       (*aff)();
       return 0;
    }
    ce code est valide selon la norme et pourtant la notation laisse penser à un pointeur de fonction bien que aff soit une fonction. S'il y a des règles de conversions implicites ça n'est pas pour rien. Dans tous les cas cet argument n'est pas valable.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  9. #9
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Pas d'accord :
    [CODE]
    void aff (void)...
    ...
    (*aff)();
    CODE]
    ce code est valide selon la norme et pourtant la notation laisse penser à un pointeur de fonction bien que aff soit une fonction. ...
    Qui écrit des choses déplaisantes comme ça ?
    Je n'ai pas dit qu'on ne pouvait pas faire du codage volontairement abscons ou trompeur tout en suivant la norme.
    Sinon, on peut aussi adopter la manière décrite par ssmario2 un peu plus haut
    Dans tous les cas cet argument n'est pas valable.
    Il explique pourtant bien le pourquoi de ma réponse selon la demande du posteur.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  10. #10
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut (*pf_foo)();
    L'argument de diogene est pourtant le plus valable de tous ceux mentionnés...

    La norme prévoit effectivement les deux formes. La première originelle est bien (*pf_foo)();

    La deuxième a été introduite, pour faire "plus simple" et l'identificateur pf_foo est implicitement converti en pointeur sur la fonction pf_foo.

    Les deux formes sont donc ok et définies par la normes.

    Donc, pourquoi Diogène recommande (et pour ma part, il a entièrement raison) la première ?

    D'une part, c'est la forme la plus logique.. Mais çà, à la rigueur on s'en fout.

    D'autre part, quand on bosse sur des gros projets et des dizaines milliers de lignes de code, cela permet lors du premier coup d'œil de savoir que l'on manipule un pointeur sur une fonction et pas un appel direct à une fonction.

    Identifier simplement ce qu'on manipule permet de faire du code plus robuste que du code peut être plus light mais plus source de bug...

    @nicolas.sibton : ton raisonnement se vaut, certes, mais cela reste du pinnaillage intellectuel et de la prêche de l'absurde qui reste bien stérile dans la pratique...

    Dun point de vue empirisme et qaulité de code, je persiste à dire que la forme initiale de la norme et recommandée par Diogene reste la meilleure solution pour produire du code de qualité
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  11. #11
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Je partage les avis de Vincenzo et Diogène. Le C est tellement permissif qu'il est souhaitable de se donner quelques règles. L'écriture (*pf_foo)() démontre clairement la volonté de l'auteur du code d'utiliser un pointeur de fonction.

  12. #12
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par 3DArchi
    Je partage les avis de Vincenzo et Diogène ... L'écriture (*pf_foo)() démontre clairement la volonté de l'auteur du code d'utiliser un pointeur de fonction.
    Bah dans ce cas il faut également toujours écrire int * p = &(t[0]); - t étant un tableau - au lieu de int * p = t; car cela laisse penser que t est un int * ...

  13. #13
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 011
    Points : 1 375
    Points
    1 375
    Par défaut
    Citation Envoyé par Melem Voir le message
    Bah dans ce cas il faut également toujours écrire int * p = &(t[0]); - t étant un tableau - au lieu de int * p = t; car cela laisse penser que t est un int * ...
    On utilise quand même plus fréquemment les pointeurs sur tableaux que sur fonction, on est plus habitués du coup à jeter un oeil à la variable t pour savoir ce que c'est. En revanche, si je tombe sur une instruction pf_foo(), je ne vais pas imaginer instinctivement qu'il s'agit d'un pointeur sur fonction et non d'une fonction.

  14. #14
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par muad'dib
    En revanche, si je tombe sur une instruction pf_foo(), je ne vais pas imaginer instinctivement qu'il s'agit d'un pointeur sur fonction et non d'une fonction.
    C'est dans ces moments où l'on s'aperçoit que respecter une convention de nommage est important ("pf_" pour variable de type pointeur de fonction)!

    Mais j'avoue aussi préférer la forme originelle pour les mêmes raisons déjà formulées.

Discussions similaires

  1. opengl et pointeur de fonction
    Par Oldhar dans le forum C
    Réponses: 5
    Dernier message: 06/11/2003, 23h56
  2. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37
  3. Matrice de pointeurs de fonctions
    Par sebduth dans le forum C
    Réponses: 15
    Dernier message: 18/07/2003, 14h03
  4. [Kylix] Pointeur de fonctions
    Par _dack_ dans le forum EDI
    Réponses: 1
    Dernier message: 03/07/2003, 10h17
  5. pointeur de fonction
    Par kardath dans le forum C
    Réponses: 4
    Dernier message: 28/12/2002, 14h39

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