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 :

Parametres d'entrées


Sujet :

C

  1. #1
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut Parametres d'entrées
    Salut,

    Bon ça fait longtemps que je me tâte sur le sujet mais faut que j'en parle chez dev.com

    Qd on m'a appris le C, j'ai pris la bonne habitude de mettre les chaines en parametres de type "entrée" aux fonctions comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void func (const char * str);
    Je le fais aussi quand je passe un pointeur sur un objet auquel je veux rien modifier, ou bien un pointeur sur le premier element d'un tableau.

    Si l'utilité du const est ici evidente et souligne clairement le passage de parametre en entrée, on m'a appris aussi a mettre des const aux parametres non pointeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void func (const int a, const int b);
    L'utilité, outre le fait de rajouter du sens au parametre (j'avais assimilé que const = parametre d'entrée), je l'ai comprise assez tard : ça sert en fait à eviter de modifier ces parametres par megarde

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void func (const int a, const int b) {
        if (a = 4)
            return;
    /*...*/
    }
    Ici, j'aurais voulu ecrire (a == 4), et grace au const, le compilateur me dit que je peux pas affecter a.


    C'est bien, mais j'ai pas l'impression que cette technique soit utilisée par les professionnels du C.
    Je pense à toutes les fonctions de la libraire standard du C, je n'ai pas remarqué de fonction ayant un parametre non pointé marqué d'un const

    De plus, si on le fait pour les parametres non pointeurs, pourquoi ne pas le faire aussi pour le pointeur des parametres pointés? Emdel a deja utilisé cette syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void func (const char const * in_str, char const * out_buff);

    En un mot : pour ou contre cette pratique?

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: Parametres d'entrées
    Citation Envoyé par Gruik
    Qd on m'a appris le C, j'ai pris la bonne habitude de mettre les chaines en parametres de type "entrée" aux fonctions comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void func (const char * str);
    C'est une Bonne Pratique, et elle est massivement utilisée dans la bibliothèque standard.
    Je le fais aussi quand je passe un pointeur sur un objet auquel je veux rien modifier, ou bien un pointeur sur le premier element d'un tableau.
    D'une façon générale, tout pointeur sur un objet qui ne doit pas être modifié par la fonction. OK.
    Si l'utilité du const est ici evidente et souligne clairement le passage de parametre en entrée, on m'a appris aussi a mettre des const aux parametres non pointeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void func (const int a, const int b);
    Ça, c'est autre chose qui relève de la Bonne Conception, et qui ne regarde pas l'utilisateur de la fonction.
    L'utilité, outre le fait de rajouter du sens au parametre (j'avais assimilé que const = parametre d'entrée), je l'ai comprise assez tard : ça sert en fait à eviter de modifier ces parametres par megarde
    Encore une fois, il s'agit d'une pratique de Bonne Conception. Il est en effet curieux ou dérangeant de modifier la valeur d'un paramètre que l'appelant s'est cassé la tête à renseigner avec une valeur qui mérite probablement un peu plus de considération.

    Dans la pratique, il est vrai que la modification d'une telle valeur est souvent la mise en évidence d'une erreur de conception (le codeur a oublié que la modification de la valeur était locale et que la valeur initiale était inchangée).

    D'une façon générale, c'est une Bonne Pratique.

    On peut cependant objecter que cette pratique peut, dans certains cas, imposer l'usage de variables locales supplémentaires. C'est possible, et si des contraines l'exigent, on pourra déqualifier les paramètres de const à normal, de façon à ce qu'ils puissent être utilisés comme variables modifiables. AMA, ça reste exceptionnel.
    C'est bien, mais j'ai pas l'impression que cette technique soit utilisée par les professionnels du C.
    Qu'en sais-tu ? C'est une technique de codage, pas d'interface. Ca n'apparait donc pas dans le prototype[1].
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /* x.h */
    int x(int a);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    /* x.c */
    #include "x.h"
    int x(int const a)
    {
    }
    Emdel a deja utilisé cette syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void func (const char const * in_str, char const * out_buff);
    Heink ? 2 const ? Sortie const ? Non. Sûrement pas. Cite tes sources !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void func (char const * in_str, char * out_buff);
    -------------------------
    [1] du moins dans un monde idéal.

    Certains implémenteurs, peu au fait de ces subtilités (VC++6, DIAB), refusent cette 'disparité' qui est considérée comme une erreur de codage.

    Le qualificateur de protection des paramètre doit donc, soit être supprimé (et on perd un contrôle de conception) soit être publié dans le prototype, ce qui alourdit celui-ci, et provoque des réaction et des confusions chez l'utilisateur. Dans mes projets professionnels (peu d'utilisateurs), j'ai choisi cette option, avec une explication à la demande...

  3. #3
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Merci pour ces précisions.

    Oui, je t'ai deja vu ecrire des pointeurs constants sur des variables constantes, maintenant chuis pas sur de la syntaxe, c'était peut etre "const char * const"


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    /* x.h */
    int x(int a);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    /* x.c */
    #include "x.h"
    int x(int const a)
    {
    }
    Je croyais que ça donnait une erreur..


    Il est en effet curieux ou dérangeant de modifier la valeur d'un paramètre que l'appelant s'est cassé la tête à renseigner avec une valeur qui mérite probablement un peu plus de considération.
    Okay, mais pour les pointeurs aussi non? l'appelant s'est surement cassé la tete pour les fournir..

    Peut etre le C aurait il du faire en sorte que tous les parametres soient constants finalement ?

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Gruik
    Oui, je t'ai deja vu ecrire des pointeurs constants sur des variables constantes, maintenant chuis pas sur de la syntaxe, c'était peut etre "const char * const"
    Oui, c'est plutôt çà ! Tu m'as l'air de pédaler dans la choucroute...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    /* x.h */
    int x(int a);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    /* x.c */
    #include "x.h"
    int x(int const a)
    {
    }
    Je croyais que ça donnait une erreur..
    Comme je l'ai déjà indiqué, certains implémenteurs, qui ne savent pas lire la norme, aussi...). pas de problème avec Borland et gcc.
    Il est en effet curieux ou dérangeant de modifier la valeur d'un paramètre que l'appelant s'est cassé la tête à renseigner avec une valeur qui mérite probablement un peu plus de considération.
    Okay, mais pour les pointeurs aussi non? l'appelant s'est surement cassé la tete pour les fournir..
    Oui. Pour les pointeurs, il faut distinguer 2 qualificateurs const :
    Celui qui protège la source :
    ou
    et celui qui protège le pointeur lui-même :
    On peut bien sûr combiner les deux :
    ou

Discussions similaires

  1. tester les parametres à l'entrée d'un script
    Par rsuinux dans le forum Langage
    Réponses: 5
    Dernier message: 18/11/2007, 21h38
  2. CR XI R2 Etat et sous etat avec même parametre d'entrée
    Par lolafrite dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 01/10/2007, 14h46
  3. Parametre d'entrée : une fonction!
    Par Enayem dans le forum C++
    Réponses: 15
    Dernier message: 04/06/2007, 13h44
  4. Réponses: 1
    Dernier message: 04/04/2007, 06h12
  5. Controle des parametres d'entrées
    Par Florent Coulon dans le forum Jasper
    Réponses: 6
    Dernier message: 15/02/2007, 14h51

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