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

Langage C++ Discussion :

in out parameter


Sujet :

Langage C++

  1. #1
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 187
    Points : 65
    Points
    65
    Par défaut in out parameter
    Bonjour tous le monde, je développe un parser C++, donc j'ai besoin de comprendre la syntaxe d'abord, et tous les cas possible pour ecrire cette syntaxe

    pouvez-vous m'aider de savoir comment peut-on déclarer les in/out parameter (tous les cas possible), et s'il y'a un document ça sera mieux

    j'ai trouvé ce lien qui explique bien, mais je voulais savoir es-ce qu'on peut ajouter un specifier (modifier) avant ou après les 2 mot clé "in" ou "out"

    parce que dans ma grammaire, on trouve

    Specifieropt Type Specifieropt Parametre

    ou je dois ajouter les mot clés in et out ?!!

    Cordialement

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut

    En C++, les paramètres peuvent être passés:
    1. par valeur
    2. par pointeur
    3. par référence

    I - Le passage par valeur occasionne la copie de l'objet passé en paramètre, et les éventuelles modifications apportées au paramètre ne sont pas répercutées sur l'objet d'origine.

    C'est donc un paramètre "in".

    II-Le passage par pointeur transmet "l'adresse à laquelle se trouve" l'objet qui nous intéresse.

    Si on modifie "ce qui est pointé par" le pointeur, on modifie l'objet d'origine.

    C'est donc un paramètre "in / out".

    III-Le passage par référence va transmettre "un alias" de l'objet d'origine.

    Si l'on indique rien, il est possible de modifier l'argument, et de répercuter les modifications sur l'objet d'origine. C'est donc un paramètre "in / out "

    Si on ajoute le mot clé const, nous passons un alias constant de l'objet d'origine. Le compilateur refusera alors toute tentative de modification du paramètre, et, par conséquent, de l'objet d'origine.

    Comme il n'est pas possible de modifier une rérférence constante, nous avons affaire à... un paramètre "in".

    Si l'on ajoute le mot clé volatile, on signale au compilateur que l'objet est susceptible d'être modifié par un accès concurrent entre deux accès durant la fonction.

    Ce n'est pas à proprement parler un paramètre in/out, mais il peut être modifié par un autre thread, par exemple.

    Enfin, il est possible de déclarer le paramètre comme constant volatile, indiquant que l'objet ne sera pas modifié, mais que plusieurs threads sont susceptibles d'y accéder

    La déclaration d'un paramètre peut prendre deux formes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    type < const / volatile > < pointeur / référence > 
    type < const / volatile > < pointeur / référence > identifiant
    la premiere forme ne pouvant être utilisé que lorsque l'on n'a pas besoin d'accéder au paramètre (déclaration de la fonction dans un fichier d'en-tête ou fonction lançant directement une exception, par exemple).

    La seconde devant être utilisé si l'on doit accéder au paramètre.

    Cependant, si la deuxième forme est utilisées et que l'on ne fait jamais appel au paramètre, certains réglages du compilateurs font qu'il nous envoie un avertissement proche de "attention 'param' est défini mais jamais utilisé "

    Enfin, il faut savoir que la règle générale pour les mots clés const et volatile est de s'appliquer à ce qui les précèdent directement.

    Ainsi le mot clé const dans le code suivant
    s'applique à Type, alors que dans le code
    il s'applique... à la marque de pointeur

    Mais il y a une exception : si le mot clé const (ou volatile) n'est précédé par rien, il s'applique alors à ce qui le suit directement.

    Ainsi, les codes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const Type &
    const Type *
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Type const &
    Type const *
    sont-ils respectivement identiques
    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 confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Citation Envoyé par koala01 Voir le message
    ....
    Ainsi, les codes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const Type &
    cont Type * //<== Coquille ici >< !
    Le lien semble être une proposition pour c++0x, qui, à ma conaissance, ne sera pas adopté. D'ailleurs, je n'en avais jamais entendu parler...

    [edit totalement hs]
    D'ailleurs vous avez jamais remarquez que c'est anti-logique la façon de faire. Style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     type const * const machin
    Si on applique la règle du "avant", alors le type est constant (traduction littéraire, on ne peux pas changer de type ???) et l'étoile, donc le pointeur, est constant.

    Une écriture "logique", ou plutôt instinctive, aurait été
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    type * const machin const
    Ou alors de dire que justement, il s'applique au mot après (les mot const aurait alors l'inverse des signification qu'ils ont actuellement).

    Mais bon, la première et pénible car il faudrait tout le temps nommé la variable, et la seconde manque toutefois d'une certaine esthétique...

    Ben oui, c'est moche et ça fait pas de jeu de mot >< !
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par Lavock Voir le message
    Le lien semble être une proposition pour c++0x, qui, à ma conaissance, ne sera pas adopté. D'ailleurs, je n'en avais jamais entendu parler...
    Non, c'est la regle...

    int const & i es strictement similaire à const int & i, et, char const * est normalement similaire à const char * car l'interprétation se fait de droite à gauche... Sauf si rien ne précède le mot clé...

    Par contre, il y a une différence entre char const * et char * const, le premier représentant un pointeur sur caractère(s) constant(s), le second représentant un pointeur constant sur caractère(s) (pas forcément constant(s) )
    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
    Inscrit en
    Avril 2008
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 187
    Points : 65
    Points
    65
    Par défaut
    merci pour cette explication

    Citation Envoyé par koala01 Voir le message

    En C++, les paramètres peuvent être passés:
    1. par valeur
    2. par pointeur
    3. par référence


    La déclaration d'un paramètre peut prendre deux formes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    type < const / volatile > < pointeur / référence > 
    type < const / volatile > < pointeur / référence > identifiant
    d'après cette explication, je comprend qu'on a pas un mot clé en C++ qui s'appel IN/OUT ?

    mais j'ai trouvé un exemple qui contient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void CApplicationOptions::Clone(IN OUT CApplicationOptions* pApplicationOptions)
    {
        memcpy(pApplicationOptions,this,sizeof(CApplicationOptions));
    }

  6. #6
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Non, c'est la regle...
    Tu es allé sur le lien ? perso, je ne connais pas de in/out specifier >< !

    [Edit] Heu, la coquille, c'est le s manquant hein !
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par Lavock Voir le message
    Tu es allé sur le lien ? perso, je ne connais pas de in/out specifier >< !
    au temps pour moi...

    Je ne parlais pas du lien, mais du mot clé const et de sa signification en fonction dela place qu'il occupe...

    in/out specifier a peut être effectivement été proposé pour C++0x, mais n'est, quoi qu'il arrive, pas utilisable avec la norme actuelle
    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

  8. #8
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Je ne parlais pas du lien, mais du mot clé const et de sa signification en fonction dela place qu'il occupe...
    Je suis bien d'accord avec ça, juste que dans l'absolue, je trouve ça "moyen" le faite que spécifié un "type constant" se traduit par une "variable constante". C'est pas "naturelle". Mais c'était juste un gros HS >< !
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  9. #9
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par mima_mine Voir le message
    merci pour cette explication


    d'après cette explication, je comprend qu'on a pas un mot clé en C++ qui s'appel IN/OUT ?
    Pas dans l'état actuel des choses, en tout cas...
    mais j'ai trouvé un exemple qui contient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void CApplicationOptions::Clone(IN OUT CApplicationOptions* pApplicationOptions)
    {
        memcpy(pApplicationOptions,this,sizeof(CApplicationOptions));
    }
    Le fait qu'ils soient écrit en majuscules me fait penser à des symboles définis par une directive préprocesseur...

    Il faudrait sans doute trouver le #define correspondant, mais, à mon sens, c'est un ajout fait par la boite qui a créé le code.

    Et il n'est pas exclus (bien que je ne fasse que le supputer ici) que ces deux symboles soient simplement défini à... rien... uniquement pour permettre au lecteur de se rendre compte que le paramètre passé est destiné à modifier l'objet d'origine
    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

  10. #10
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par Lavock Voir le message
    Je suis bien d'accord avec ça, juste que dans l'absolue, je trouve ça "moyen" le faite que spécifié un "type constant" se traduit par une "variable constante". C'est pas "naturelle". Mais c'était juste un gros HS >< !
    [pour clore le HS ] ben, comment lis tu "à haute voix" et en "bon français" le code
    Pour moi, cela se lit "i est un objet constant de type int auquel on donne la valeur 10" vu que l'on a ici deux expressions séparées par l'opérateur = ...

    Dés lors, le code
    serait, pour ma part, lu sous la forme de "j est un pointeur vers un objet constant de type int auquel on donne... l'adresse de i" et qui serait différent de
    que je lirais sous la forme de "k est un pointeur constant vers un objet de type int auquel on donne l'adresse de i"

    et cela marche aussi très bien avec les références:
    se lisant "ref est l'alias d'un objet constant de type int se référant à i"

    Etant attendu que le code
    n'a aucun sens (et est d'ailleurs interdit par le langage )

    Mais bon, j'ai tendance à être verbeux dans ma manière de lire du code
    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

  11. #11
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Mais bon, j'ai tendance à être verbeux dans ma manière de lire du code
    Je confirme >< !

    PS : Euh, tu as tojours pas mis le s pour transformer cont en const !
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  12. #12
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par Lavock Voir le message
    Je confirme >< !

    PS : Euh, tu as tojours pas mis le s pour transformer cont en const !
    S'il n'y a que ca pour te faire plaisir
    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

  13. #13
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 187
    Points : 65
    Points
    65
    Par défaut
    Citation Envoyé par koala01 Voir le message

    Le fait qu'ils soient écrit en majuscules me fait penser à des symboles définis par une directive préprocesseur...
    ok, je comprends bien maintenant
    Merci

  14. #14
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par mima_mine Voir le message
    ok, je comprends bien maintenant
    Merci
    Attention, ce ne sont que supputations de ma part... je peux tout aussi bien partir dans une direction totalement opposée à la réalité de la chose
    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

  15. #15
    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
    Salut,
    Je n'ai pas mémoire d'avoir vu l'ajout d'attribut in/out pour C++0x. Le lien fourni décrit juste les souhaits de l'auteur sur ce qu'il aimerait voir dans le langage ... et ça n'engage que lui.
    Sinon, comme l'a précisé Koala, const est encore le meilleur indicateur d'un paramètre in ou out, y compris pour 'this' avec les fonctions constantes.

  16. #16
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Le in/out tel qu'on peut le voir en .Net (comme les mots-clés ref et out en C#) possède une distinction de plus que const&/non-const&: Les vérifications d'initialisation.
    • Un paramètre in/out (ref) doit être initialisé avant l'appel de la fonction.
    • Un paramètre out n'en a pas besoin, mais doit être écrit au moins une fois dans la fonction, pour chaque chemin possible où la fonction retourne.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  17. #17
    Membre éclairé
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par mima_mine Voir le message
    Bonjour tous le monde, je développe un parser C++, donc j'ai besoin de comprendre la syntaxe d'abord, et tous les cas possible pour ecrire cette syntaxe
    Je suis en train de développer un tel projet.
    Je t'invite à suivre le lien dans ma signature !
    Cours : Initiation à CMake
    Projet : Scalpel, bibliothèque d'analyse de code source C++ (développement en cours)
    Ce message a été tapé avec un clavier en disposition bépo.

Discussions similaires

  1. Out parameter comme en C#
    Par ricky78 dans le forum Débuter avec Java
    Réponses: 9
    Dernier message: 06/01/2012, 16h18
  2. [Data] StoredProcedure avec Out Parameter Index-by table
    Par Gob4 dans le forum Spring
    Réponses: 1
    Dernier message: 29/07/2009, 14h03
  3. Réponses: 3
    Dernier message: 24/02/2009, 21h26
  4. Comment récupérer le résultat d'une procédure stockée (OUT parameter) ?
    Par java2008 dans le forum Interfaces de programmation
    Réponses: 1
    Dernier message: 08/04/2008, 13h00
  5. Comment utiliser OUT ?
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 3
    Dernier message: 20/07/2002, 09h35

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