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

  1. #1
    Membre averti
    Avatar de Pierre8r
    Homme Profil pro
    Inscrit en
    octobre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : octobre 2004
    Messages : 516
    Points : 338
    Points
    338

    Par défaut Le programme ne produit pas l'output indiqué dans le livre.

    Bonjour,

    Le programme ne produit pas l'output indiqué dans le livre.

    Soit le code suivant :

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #include <iostream>
    using namespace std ;
    class point
    {
        int x, y ;
    public :
        point (int abs=0, int ord=0)     // constructeur "usuel"
        {
            x=abs ;
            y=ord ;
            cout << "++ Appel Const. usuel   " << this << " " << x << " " << y << "\n" ;
        }
        point (const point & p)          // constructeur de recopie
        {
            x=p.x ;
            y=p.y ;
            cout << "++ Appel Const. recopie " << this << " " << x << " " << y << "\n" ;
        }
        ~point ()
        {
            cout << "-- Appel Destr.         " << this << " " << x << " " << y << "\n" ;
        }
        point symetrique () ;
    } ;
     
    point point::symetrique ()
    {
        point res ;
        res.x = -x ;
        res.y = -y ;
        return res ;
    }
     
    int main()
    {
        point a(1,3), b ;
        cout << "** avant appel de symetrique\n" ;
        b = a.symetrique () ;
        cout << "** apres appel de symetrique\n" ;
    }
    Il est indiqué que le code doit produire un output proche de ça :

    ++ Appel Const. usuel 0x61ff10 1 3
    ++ Appel Const. usuel 0x61ff08 0 0
    ** avant appel de symetrique
    ++ Appel Const. usuel 0x61ff18 0 0
    ++ Appel Const. recopie
    -- Appel Destr. 0x61ff18 -1 -3
    -- Appel Destr.
    ** apres appel de symetrique
    -- Appel Destr. 0x61ff08 -1 -3
    -- Appel Destr. 0x61ff10 1 3
    Mais l'output est celui-ci :
    ++ Appel Const. usuel 0x61ff10 1 3
    ++ Appel Const. usuel 0x61ff08 0 0
    ** avant appel de symetrique
    ++ Appel Const. usuel 0x61ff18 0 0
    -- Appel Destr. 0x61ff18 -1 -3
    ** apres appel de symetrique
    -- Appel Destr. 0x61ff08 -1 -3
    -- Appel Destr. 0x61ff10 1 3

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : décembre 2015
    Messages : 818
    Points : 4 243
    Points
    4 243

    Par défaut

    Bonjour,

    Ce qui se déroule dans ce cas dépend à la fois du compilateur et de l'évolution de la norme.
    Ici, il peut y avoir 4 objets créés ou 3 ou 2 (maximum 3 depuis C++17). L'auteur de ton bouquin ne semble pas connaître le RVO.
    Plus grave, il ne semble pas parler du constructeur par déplacement qui pourrait être utilisé ici ; concept apparu en C++11 qui peut être important de connaître, on pourrait avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ++ Appel Const. usuel   0113FCF8 1 3            // seul a est construit pour le moment
    ** avant appel de symetrique
    ++ Appel Const. usuel   0113FD00 0 0            // res et b sont un seul objet
    ** apres appel de symetrique
    -- Appel Destr.         0113FD00 -1 -3          // res et b sont détruits
    -- Appel Destr.         0113FCF8 1 3

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    26 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : septembre 2005
    Messages : 26 824
    Points : 39 524
    Points
    39 524

    Par défaut

    Pour traduire en clair, suite à la Return Value Optimization (RVO), l'appel b = a.symetrique () ; a créé la valeur directement dans b, éliminant le besoin de passer par un objet temporaire et copier l'objet.
    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.

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    juin 2009
    Messages
    3 972
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués

    Informations forums :
    Inscription : juin 2009
    Messages : 3 972
    Points : 11 059
    Points
    11 059
    Billets dans le blog
    1

  5. #5
    Membre expert
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    avril 2016
    Messages
    799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : avril 2016
    Messages : 799
    Points : 3 503
    Points
    3 503

    Par défaut

    Citation Envoyé par dalfab Voir le message
    Ici, il peut y avoir 4 objets créés ou 3 ou 2 (maximum 3 depuis C++17).
    Non, il y en a forcément au moins 3 appels au constructeur de point : un pour créer a, un pour créer b et un pour créer a.symetrique (). Dans l'instruction b = a.symetrique () ;, il ne peut pas y avoir d'optimisation spéciale pour modifier b sans appeler le constructeur de point.

    D'ailleurs, même en C++17, il peut y avoir 4 appels au constructeur : avec le code actuel de point::symetrique, le C++17 ne garantit pas l'élision de copie. Le C++17 garantit la RVO, mais pas la NRVO.

    Pour que le C++17 garantisse l'élision de copie, il faut que point::symetrique retourne une prvalue, par exemple comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    point point::symetrique ()
    {
        return point(-x, -y);
    }
    Plus de détails : https://en.cppreference.com/w/cpp/language/copy_elision

  6. #6
    Membre averti
    Avatar de Pierre8r
    Homme Profil pro
    Inscrit en
    octobre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : octobre 2004
    Messages : 516
    Points : 338
    Points
    338

    Par défaut

    Merci à tous.
    J'ai essayé Build options... avec C++98 dans Code::Block et j'ai eu le même résultat.

  7. #7
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : décembre 2015
    Messages : 818
    Points : 4 243
    Points
    4 243

    Par défaut

    L'option pour désactiver le RVO avec g++ est -fno-elide-constructors.

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    août 2004
    Messages
    5 444
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : août 2004
    Messages : 5 444
    Points : 15 894
    Points
    15 894

    Par défaut

    Une petite recherche sur le code que tu mets en exemple semble indiquer qu'il provient d'un livre de 2007. Le C++ a beaucoup évolué depuis, et pas seulement dans les optimisations que propose telle ou telle construction, mais suffisamment pour que l'on n'écrive plus du C++ aujourd'hui comme on l'écrivait à l'époque. Donc à moins que tu aies des contraintes particulières, je te conseillerais pour ton apprentissage d'utiliser un ouvrage plus récent.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  9. #9
    Membre averti
    Avatar de Pierre8r
    Homme Profil pro
    Inscrit en
    octobre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : octobre 2004
    Messages : 516
    Points : 338
    Points
    338

    Par défaut

    Citation Envoyé par JolyLoic Voir le message
    Une petite recherche sur le code que tu mets en exemple semble indiquer qu'il provient d'un livre de 2007. Le C++ a beaucoup évolué depuis, et pas seulement dans les optimisations que propose telle ou telle construction, mais suffisamment pour que l'on n'écrive plus du C++ aujourd'hui comme on l'écrClaude Delannoyivait à l'époque. Donc à moins que tu aies des contraintes particulières, je te conseillerais pour ton apprentissage d'utiliser un ouvrage plus récent.
    Bonjour,

    Le code source provient du livre :
    https://www.editions-eyrolles.com/Li...r-en-langage-c
    Livre édité en octobre 2017

    Le source code est librement téléchargeable sur la page compléments à cette adresse :
    https://www.eyrolles.com/download/97...merEnC++9e.zip

    C'est un exemple du chapitre 13, copyctr3.cpp

    Je constate que le livre de Claude Delannoy ne fait pas l’unanimité parmi les membres du forum.
    Je suis ouvert à toute suggestion d'un meilleur ouvrage, d'un autre coté je souhaite également amortir mon achat de 38€.
    Je constate en effet que tout ce qu'il donne n'est pas actualisé, mais j'y trouve néanmoins pas mal d'informations.
    J'ai fait des achats que je regrette plus que ce livre.

  10. #10
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    août 2004
    Messages
    5 444
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : août 2004
    Messages : 5 444
    Points : 15 894
    Points
    15 894

    Par défaut

    Ah... C'est donc le même code en 2017 qu'en 2007...

    Je pourrais suggérer des moyens de rentabiliser l'achat de ce livre (qui fait globalement l'unanimité... contre lui), mais aucun qui ferait plaisir à son auteur...

    Je te conseille vivement si tu le peux de te tourner vers des ressources en anglais... Car si tout ce que dit le livre n'est pas faux, il va poser deux problèmes :
    - Il dit quand même pas mal de choses fausses, ce message en est une nouvelle preuve. Là, tu l'as repéré, mais est-ce que ce sera le cas à chaque fois ? Et même si c'est le cas, quand tu verras quelque-chose qui te semble étrange, difficile à comprendre, auras-tu confiance dans ce qui est marqué, ou vas-tu être rongé d'un doute qui pourra ajouter une difficulté inutile dans ton apprentissage ?
    - Il y a plein de choses vraies et importantes qu'il ne dit pas. Et là, à moins d'avoir d'autre ressources, ce n'est pas possible de voir ce qui manque juste en lisant le livre... Et cette omission fera que ton code sera trop complexe, trop difficile à maintenir, et accessoirement que ton employabilité sera très fortement discutable.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  11. #11
    Membre averti

    Profil pro
    Inscrit en
    décembre 2013
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2013
    Messages : 312
    Points : 393
    Points
    393

    Par défaut

    Citation Envoyé par Pierre8r Voir le message
    Je constate que le livre de Claude Delannoy ne fait pas l’unanimité parmi les membres du forum.
    Je suis ouvert à toute suggestion d'un meilleur ouvrage, d'un autre coté je souhaite également amortir mon achat de 38€.
    Je constate en effet que tout ce qu'il donne n'est pas actualisé, mais j'y trouve néanmoins pas mal d'informations.
    J'ai fait des achats que je regrette plus que ce livre.
    Tu t'es juste fait avoir par le jeu des "nouvelles" éditions que pratiquent certains auteurs peu scrupuleux : on modifie 2-3 details et on publie une nouvelle édition, pour faire croire que le livre est récent. Ca fait des ventes pour par cher.

    Mon avis sur la question : "A ce niveau, c'est du foutage de gueule envers ceux qui achètent ce type de livres." https://www.developpez.net/forums/d1.../#post10396915

    Malheureusement, tu ne seras pas le dernier a te faire avoir.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/10/2017, 22h25
  2. Sos mon programme ne marche pas
    Par monalisa_dulouvre dans le forum C
    Réponses: 49
    Dernier message: 26/12/2006, 19h35
  3. Réponses: 4
    Dernier message: 09/09/2006, 22h48
  4. Quel langage pour programme ne nécessitant pas d'install ?
    Par burnedsoul dans le forum Langages de programmation
    Réponses: 5
    Dernier message: 09/03/2006, 20h23
  5. [Dev-Pascal] Ne produit pas d'exe
    Par portix dans le forum Autres IDE
    Réponses: 8
    Dernier message: 02/07/2003, 16h14

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