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

SL & STL C++ Discussion :

adresse qui change?


Sujet :

SL & STL C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 17
    Points : 13
    Points
    13
    Par défaut adresse qui change?
    Bonjour à tous et à toutes,
    Pas sur que je suis sur le bon forum...
    J'ai un petit problème: l'orsque j'appel une fonction, l'adresse du parametre n'est pas l'adresse de l'objet que j'ai donné en paramètre!!
    (j'utilise gcc 4.2.3 pour compiler sous debian)

    la console affiche:

    ...
    parametre avant : 0x804b4a8
    [1209379096]-VERBOSE: CTasDeCartes::pushOnTop debut
    parametre dedans 0x804b284
    ...

    le code:

    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
     
    class Card64 : public IApplication, public ICard {
    [...]
    };
     
     
    class CCard64 : public IControler, public Card64 {
    [...]
    };
     
    class CTasDeCartes : public IControler, public TasDeCartes {
     
        public:
    [...]
             void pushOnTop ( ICard * pcard ) {
    		log ( "CTasDeCartes::pushOnTop debut ", VERBOSE );
    		cout << "parametre dedans " << pcard << "" << endl;		
    		[...]
    	}
     
    [...]
     
    };
    l'appel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        CCard64 * cc64_1;
        CTasDeCartes * ctas1;
    [...]//entre autre les constructions...
        cout << "parametre avant : " << cc64_1 << endl;
        ctas1->pushOnTop ( cc64_1 );

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Normal, ça s'appelle du slicing. Tu passe un pointeur sur un CCard64 à une fonction qui attend un pointeur sur un ICard, cela nécessite une conversion qui va décaler le pointeur.

    Tu peux vérifier cela en affichant (ICard*)cc64_1 avant l'appel.

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Du fait des héritages multiples, dans une instance de CCard64 il y a :
    - Un IControler (y a 2 L à controller)
    - Un ICard
    - Un IApplication
    - Puis les données membres spécifiques à CCard64

    Donc le même objet aura des adresses différentes selon qu'on le regarde en tant que ICard ou CCard64. Ce que tu constates est tout à fait normal.

    Tu pourras t'en rendre compte en faisant ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << "parametre avant : " << static_cast<ICard*>(cc64_1) << endl;
    Normal, ça s'appelle du slicing
    Le slicing c'est plutôt lorsque l'on perd les données d'une classe dérivée suite à une copie vers une instance de classe mère

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 17
    Points : 13
    Points
    13
    Par défaut ok
    Merci Laurent,
    Je pensais la même chose sans en etre sûr.
    En effet je ne pense pas non plus que ce soit du slicing.
    Du coup pour deboguer je suis obliger d'utiliser des static ou dynamic casts!
    Je vais essayer derechef.

    NB: pour la faute controller je suis au courant mais mon outil ne me permet pas de faire de refactoring, du coup je n'ai pas trop envie de tout modifier comme ca, peut-etre que j'utliserai sed et comparses un de ces quatre mais ce n'est pas une priorité pour le moment.

    Merci a tous.

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

Discussions similaires

  1. adresse this qui change
    Par skeud dans le forum Débuter
    Réponses: 21
    Dernier message: 05/06/2015, 13h43
  2. Adresse IP fixe qui change toute seul
    Par runner77 dans le forum Administration
    Réponses: 9
    Dernier message: 12/02/2014, 22h51
  3. Frames : adresse ne change pas
    Par polo-j dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 14/02/2005, 16h56
  4. Variable qui change après un DispatchMessage
    Par SekYo dans le forum Windows
    Réponses: 9
    Dernier message: 30/09/2004, 16h22
  5. Réponses: 3
    Dernier message: 22/07/2002, 14h19

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