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 :

[const_cast] pb de valeur


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 15
    Par défaut [const_cast] pb de valeur
    Bonjour à toutes et à tous

    J'ai un problème à vous soumettre. Attention, il est sans intérêt. Si vous avez des choses plus importantes à faire, passez votre chemin !!

    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
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
    	int i = 3;
    	const int j = 4;
    	int *k = &i;
     
    	try
    	{
    		k = const_cast<int*>(&j);
     
    		*k = 5;
    		cout << "&j " << &j << endl;
    		cout << " k " <<  k << endl;
     
    		cout << " j " << j << endl;
    		cout << "*k " << *k << endl;;
    	}
    	catch(...)
    	{
    		cout << "Il y a une coucougnette..." << endl;
    	}
    }
    voici le résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    &j 0xbff1d7e4
     k 0xbff1d7e4
     j 4
    *k 5
    pourquoi j ne contient pas la valeur 5 ?

    La suppresion de const à j donne bien la valeur de 5

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Par défaut
    Standard, 7.1.5.1-4 : "any attempt to modify a const object during its lifetime results in undefined behavior". Donc j peut contenir n'importe quoi.

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

    Informations professionnelles :
    Activité : aucun

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

    L'instruction const_cast<type> permet en fait de supprimer la constance/ la volabilité...

    Cela signifie que, si tu écrit un code du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    const int j=4;
    int *k;
    k=const_cast<int*>(&j);
    tu supprime la constance de j (il devient volatile)

    Par contre, si tu écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const int j=4;
    int *k;
    k=const_cast<const int*>(&j);
    k sera devenu constant, et tu ne pourra plus envisager de le modifier (avant le const_cast<int*> suivant, du moins)
    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

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    En l'occurence, je suppose que j, étant marqué comme const, a été placé dans un registre et n'a donc pas été lu une seconde fois (optimisation, quoi).

    Essaie en recompilant en -O0, ou en marquant j ou k comme volatile...
    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.

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Par défaut
    Citation Envoyé par koala01
    Cela signifie que, si tu écrit un code du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    const int j=4;
    int *k;
    k=const_cast<int*>(&j);
    tu supprime la constance de j (il devient volatile)
    Non, il reste non-volatile, mais il devient non-constant : ces deux attributs ne sont pas liés.

    Citation Envoyé par koala01
    Par contre, si tu écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const int j=4;
    int *k;
    k=const_cast<const int*>(&j);
    k sera devenu constant, et tu ne pourra plus envisager de le modifier (avant le const_cast<int*> suivant, du moins)
    Ça ne devrait pas compiler : tu assignes un pointeur sur un objet constant à un pointeur sur un objet non constant.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 15
    Par défaut
    En effet, j'ai moi aussi tendance à croire qu'il s'agirai d'une question d'optimisation ou de pile et de tas. Cependant -O0 ne change rien.

    Celà dit, la référence donné par roulious ( 7.1.5.1-4 ) veut dire ce qu'elle veut dire.

    Peut-être que ca vaudrait le coup de voir avec un autre compilateur que g++.(j'ai n'ai que lui sous la main)

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Citation Envoyé par roulious
    Non, il reste non-volatile, mais il devient non-constant : ces deux attributs ne sont pas liés.
    Ouppss... sorry...

    Ça ne devrait pas compiler : tu assignes un pointeur sur un objet constant à un pointeur sur un objet non constant.
    ca compile si tu n'essaye pas, par la suite, de modifier k... Du moins, avec mingw...
    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 averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 15
    Par défaut
    Il s'agit bien d'un probleme d'optimisation.

    L'ajout de la prorpieté "volatile" à j résout le probleme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    volatile const int j = 4;
    Il serait intéréssant de regarder le code générer.

    http://www.programmersheaven.com/art...k/article1.htm

    bye bye

Discussions similaires

  1. récupérer la valeur du 2ème champ dans un DBLookUpListBox
    Par jakouz dans le forum Bases de données
    Réponses: 3
    Dernier message: 20/07/2004, 16h45
  2. Recherche fonctions rendant la valeur
    Par Bertrand_Collet dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 26/11/2002, 12h05
  3. récupérer la valeur de sortie d'un thread
    Par jakouz dans le forum Langage
    Réponses: 3
    Dernier message: 31/07/2002, 11h28
  4. [XSLT]position d'un element de valeur specifique
    Par squat dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 25/07/2002, 16h42
  5. Réponses: 2
    Dernier message: 22/07/2002, 18h02

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