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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    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"

  8. #8
    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 !

  9. #9
    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

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