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 :

Passage de std::string en paramètre


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 85
    Par défaut Passage de std::string en paramètre
    Bonjour,

    J'ai un petit soucis dans une de mes classes. Pour informations je débute la programmation c++ sous linux avec kdevelop. Voila la partie de code posant problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while (!m_file.eof())
    {
    	std::getline(m_file, line);
    	if (line.length() == 0) continue; //empty line
    	line = removeComment(line);
    Et la méthode removeComment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::string CReadFile::removeComment(std::string l)
    {
    		//trim()
    		if (l.find_last_not_of (" ") != std::string::npos) l.erase (l.find_last_not_of                 (" ") + 1);
    		if (l.find_first_not_of (" ") != std::string::npos) l.erase (0, l.find_first_not_of (" "));
    Lorsque j'utilise le débugger pour voir la valeur de ma variable line j'ai "#test". En revanche lorsque je suis dans ma méthode removeComment ma variable l vaut "<\260\366\b<\260\366\bD\344\303\277D\322\366\b\204\322\366\b0\260\366\b\364_\360\267\210\343\303\277<\344\303\277\274\343\303\277D\344\303\277\330\343\303\277\346\305\004\b<\344\303\277\274\343\303\277\b".

    Merci pour votre aide.

  2. #2
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 26
    Par défaut
    Cette valeur de l est elle visible avant ou après l'exécution du code de removeComment (point d'arrêt placé avant la première ligne)?

    Si avant l'exécution de ce code tu vois la bonne valeur, c'est que c'est ton code est incorrect.

    Sinon, c'est bien le passage de paramètres.
    Dans ce cas, essaye de passer ta string par référence :
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // dans le while
    removeComment(line);
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void CReadFile::removeComment(std::string& l)
    {
    ...
    }

  3. #3
    Membre chevronné Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par défaut
    En effet lorsque tu fais appel à ta fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void CReadFile::removeComment(std::string l)
    Ton objet string est recopié, la modification à l'intérieur de ta fonction se font sur cette copie, et à la sortie de ta fonction tu l'objet initial n'est pas modifié
    Deux solutions :


    Le C/C++ demande une grande maitrise des pointeurs, ne tienquiete pas c'est loin d'être facile mais il faut vraiment en bouffé pour comprendre toutes les subtilités.

  4. #4
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Passer une std::string par pointeur est une hérésie. On quitte le C et les char*, c'est pas pour être en C++ avec des std::string*

    Le passage de paramétre par pointeur (conseillé par B. Stroustrup)
    Référence ?

    Le C/C++ demande une grande maitrise des pointeurs, ne tienquiete pas c'est loin d'être facile mais il faut vraiment en bouffé pour comprendre toutes les subtilités.
    Non, déjà car le C/C++ n'existe pas.

    Le C demande une bonne maitrise des pointeurs car il y en a une utilisation massive. Mais c'est le forum à coté.

    Le C++ en fait une utilisation basique et encore sous forme améliorée (pointeur intelligent)
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  5. #5
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    C'est facile :
    - si tu dois modifier ta string dans la fonction, alors tu prendras une référence : std::string& s
    - si tu ne la modifies pas, alors : const std::string& s

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Je voudrais juste intervenir sur un point de détail...

    J'ai, personnellement, horreur de l'utilisation des mots clés break et continue parce qu'ils brisent le flot d'exécution normal.

    Je n'utilise par exemple jamais continue, et n'utilise break que contraint et forcé (lorsque j'écris un test à choix multiple).

    Bien sur, ce n'est jamais qu'un avis personnel (que je partage malgré tout avec moi même ), mais je trouve dommage d'y recourir alors qu'il y a parfaitement moyen de s'en passer uniquement ne inversant le test.

    On pourra, bien sur, faire valoir que cela permet, parfois, d'éviter des niveaux d'indentations trop importants, mais, en l'espèce, ton code pourrais très bien se contenter d'un (code non corrigé)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while (!m_file.eof())
    {
    	std::getline(m_file, line);
    	if (line.length() != 0)
    	    line = removeComment(line);
    En outre, il faut savoir que eof() ne vaut vrai que lorsque la fin de fichier a... été dépassée.

    L'idéal est donc de profiter de la valeur de std::getline (qui renvoie false si elle n'a pas réussi à lire la ligne) comme valeur de test afin de déterminer s'il faut retourner dans la boucle ou non (cf: l'entrée correspondante de la FAQ).

    Cela pourrait prendre la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while(std::getline(m_file, line)
    {
        if(line.size()!=0)
        {
           removeComment(line); // où removeComment prend une std::string &
           /* la suite éventuelle */
        }
    }
    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

  7. #7
    Membre chevronné Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par défaut
    Référence ?
    "Le langage C++ par B.Strouptrup"
    Non, déjà car le C/C++ n'existe pas.
    A je voulais parler du langage C ou C++. D'ailleurs malgrès les puristes qui d'ailleurs me chauffe et qui n'apporte rien. Lorsque l'on fait du vrai C++ dans la vie on est toujours amené à d'interfacer avec du C (autant dans le monde Windows que Linux)
    Le C demande une bonne maitrise des pointeurs car il y en a une utilisation massive. Mais c'est le forum à coté.
    Bon ben je te conseille de relire mon livre de chevet "Le langage C++ par B.Strouptrup" il n'y fait référence à aucun utilisation pointeur dedans! Même par pour l'héritage !
    Le C++ en fait une utilisation basique et encore sous forme améliorée (pointeur intelligent)
    A un truc intéressant.
    Pour conclure, j'ai souvent dit des conneries et je suis le premier à les assumer, quand on argumente. Notre but est le même, partager notre connaissance, on a pas tous les mêmes habitudes, mais argumentons dessus pour que les autres choisient celles-qui lui conviennent le plus.

  8. #8
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Citation Envoyé par themadmax Voir le message
    "Le langage C++ par B.Strouptrup"
    J'ai le Stroustrup sous les yeux là, tu pourrais donner le chapitre ?

  9. #9
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Citation Envoyé par Arzar Voir le message
    J'ai le Stroustrup sous les yeux là, tu pourrais donner le chapitre ?
    Je l'ai et le relis des passages de temps en temps, depuis 5 ans, et je ne me souviens pas d'un tel passage, bizarrement.

  10. #10
    Membre chevronné Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par défaut
    Citation Envoyé par Alp Voir le message
    Je l'ai et le relis des passages de temps en temps, depuis 5 ans, et je ne me souviens pas d'un tel passage, bizarrement.
    Chapitre 5.5 Référence
    Pour qu'un programme ne soit pas trop difficile à comprendre, il est souvent préférable d'éviter les fonctions qui modifient leurs arguments. Il est préférable de renvoyer explicitement une valeur depuis la fonction ou d'exiger un argument pointeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int next(int p) { return p+1; }
    void incr(int* p) { (*p)++; }
    void g() {
    int x = 1;
    increment(x);
    x = next(x);
    incr(&x);
    Contrairement à des notations telles que x=next(x) et incr(&x), increment(x) n'indique pas clairement au lecteur que la valeur de x est en cours de modification.
    B. Stroustrup Le Langage C++ (Edition spécial, revue et corrigée) Pearson Education

    Mais encore une fois, j'aurai préférer passé ce temps a aider ce forumeur débutant, que de recopier des bouquins. Après si tu argumenter ta version je parie que cela serai plus constructif que de savoir qui a raison !

  11. #11
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Nan mais c'e n'est pas un encouragement à utiliser les pointeurs.

    Les pointeurs sont une calamité. Il faut toujours tester la nullité et on quasiment toujours obligé d'aller voir le code la fonction pour savoir ce qu'elle fait avec.

    De plus, en passant un pointeur, on ne sais pas si tu passe un objet ou un tableau C like (ok argument de merde pour un C++ moderne (y'a les vector) mais avec tout le "C With classes" qui existe, il tient).

    A l'inverse, avec une référence non constante, tu es sûr que ta fonction va modifier ton objet. Aucun test de non nullité à faire et aucune ambiguïté possible.

    Enfin, sur la gestion des effets des bords, c'est à voir au cas par cas: certains fonctions on bien raison d'utiliser des effets de bord, d'autres pas.

    Après si tu argumenter ta version je parie que cela serai plus constructif que de savoir qui a raison !
    Bah si on peut lui éviter de lui apprendre des inepties, ca sera très constructif pour lui (et pour toi au passage).
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Quelque part, c'est bien la preuve que, soit B Stroutroup peut lui aussi dire des c..., soit que le traducteur (qui, il faut l'admettre, est rarement un guru du C++, quand il est effectivement programmeur) s'est royalement vautré et a inversé le sens du texte original

    Il n'y a, effectivement, aucun sens à passer un type primitif par référence, et, dans ce cas, je préférerais une fonction renvoyant le type ad-hoc, à une fonction prenant un pointeur vers un type primitif.

    Par contre, tu trouvera énormément de monde, même parmi les autres sommités du C++, pour conseiller de donner la préférence au passage par référence en ce qui concerne les types définis par l'utilisateur.

    De plus, que ce soit l'auteur ou le traducteur, ce passage oublie un point à mon sens capital qui est... le choix d'un nom cohérent pour la fonction, qui, seul, est normalement bien plus à même de donner l'information sur l'éventuelle modification interne d'un argument qu' un & ou qu'un * pouvant passer inaperçu dans le code.

    Effectivement, si tu nomme ta fonction foo ou bar, il te sera difficile de déterminer si l'argument passé est modifié ou non, par contre, si tu la nomme incr ou, mieux, increment, il ne reste strictement aucun doute sur le but de la fonction
    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

Discussions similaires

  1. [XL-2007] Passage d'une string en paramètre
    Par kacedda dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 04/08/2014, 13h55
  2. Passage de std::pair en paramètre fail !
    Par Captain'Flam dans le forum Débuter
    Réponses: 4
    Dernier message: 03/04/2014, 21h42
  3. Réponses: 1
    Dernier message: 15/04/2005, 11h30
  4. std::string, operator =
    Par tut dans le forum SL & STL
    Réponses: 10
    Dernier message: 05/11/2004, 12h07
  5. Type String* en paramètre...
    Par Invité dans le forum MFC
    Réponses: 4
    Dernier message: 24/02/2004, 19h48

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