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 :

[debutant] pointeur de pointeur ?


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 13
    Points : 13
    Points
    13
    Par défaut [debutant] pointeur de pointeur ?
    Bonjour, je redecouvre le C++ (j'en ai pas fait depuis l'ecole, il y a 5 ans), et j'ai fait l'experience suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        int i = 10; 
        int* pi = &i; // pi pointe sur i
        void *pvoid =π //pvoid pointe sur pi
     
        cout << "i=" << i << endl;
        cout << "*pi=" <<*pi << endl;
        cout << "pi=" <<pi << endl;
        cout << "&pi=" <<&pi << endl;
        cout << "pvoid" << pvoid << endl;
    En "toute logique", il m'a sorti ceci :
    i=10
    *pi=10
    pi=0x22ff74
    &pi=0x22ff70
    pvoid=0x22ff70

    Jusque la pas de problèmes.
    Ma question : est-il possible de recuperer i (10) à partir de pvoid ?

    D'avance merci !

  2. #2
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    Non, on ne peut pas déréférencer un type void *.
    Il faut remettre pvoid dans un int*.

  3. #3
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Alors, tout d'abord : en C++ éviter les pointeurs au maximum (il y a des cas où ils sont nécessaires bien sûr, svp pas de trolls ), sinon c'est du C/C++ et c'est pas propre ^^

    ensuite, tu peux tout à fait retrouver i
    façon C (pas propre, mais sûr que ça marche)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout <<(**(int**)pvoid) <<endl;
    façon C++ (un peu plus propre, mais pas sûr que ça marche ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout <<(**static_cast<int**>(pvoid)) <<endl;
    Je ne suis pas sûr qu'il ne faille pas utiliser dynamic_cast plutôt que static_cast

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    C'est bien static_cast qu'il faut utiliser car dynamic_cast utilise des infos qui ne sont pas présentes dans un void*

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 13
    Points : 13
    Points
    13
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout <<(**static_cast<int**>(pvoid)) <<endl;
    yep, ca ca marche

    En fait l'idée à la base était de créer une classe du type CollectionBase du framework dot net. Pour se faire, il me faudrait une liste d'objet "non typé".
    La classe de base contient cette liste, et les classes héritées surchargent les méthodes Add, Remove et Item(index) pour typer les objets.
    (J’ai du mal a expliquer, mais en fait en C# c'est super simple)

    Bref tous ceci m'amène à la question :
    Puisqu'il faut l'éviter, y a t-il un autre moyen de stocker des références à des objets sans connaître leur type, mais tout en pouvant récupérer l'objet typé lorsqu'on en a besoin ?

  6. #6
    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 : 40
    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
    Les conteneurs avec classe de base et void*, c'est bon pour les langages ne connaissant pas la généricité. En C++, on utilisera bien plus avantageusement les templates pour ce genre de conteneur. Cela a déjà été discuté sur ce forum, il me semble.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 13
    Points : 13
    Points
    13
    Par défaut
    Bon ba il ne me reste qu'a faire une recherche au mot clef template alors.

    Merci a tous.

  8. #8
    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 : 40
    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
    Consulte les tutoriels, les forums et la FAQ C++ sur developpez.com, il y a tout ce qu'il faut.

    Les templates sont un concept important C++.

  9. #9
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    Le dynamic_cast c'est pour des objets qui sont de la même famille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class Mere
    {
        public :
            Mere(void);
    };
    class Fille : public Mere
    {
        public :
            Fille : Mere (void) {}
    };
    Mere* pMere = new Fille;
    Fille* pFille = dynamic_cast<Mere*>(pMere); // On "transforme" une mere en fille

  10. #10
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    très bon exemple Rafy, à cela près qu'il fallait faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fille* pFille = dynamic_cast<Fille*>(pMere); // On "transforme" une mere en fille
    mais c'est pas grave

    le truc c'est que je ne savais pas si le dynamic_cast n'était pas applicable ici, car int** est le ""VRAI"" type du void*

  11. #11
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    Oups, Ca c'est que j'apelle une erreur Con**, un truc chiant quand tu cherches où ça plante... Ouais, comme l'a dit Laurent, int c'est pas une class qui dérive de void*, donc le dynamique_cast, il ne va pas comprendre grand chose...

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

Discussions similaires

  1. Pointeurs et pointeurs de pointeurs
    Par wallace27 dans le forum C
    Réponses: 10
    Dernier message: 09/04/2015, 22h07
  2. Réponses: 21
    Dernier message: 06/08/2009, 09h31
  3. Réponses: 6
    Dernier message: 26/05/2007, 00h33
  4. [debutant] Problème de pointeur
    Par x dans le forum C
    Réponses: 8
    Dernier message: 19/01/2006, 11h00
  5. [debutant]Convertir un pointeur byte en String
    Par patmaba dans le forum SL & STL
    Réponses: 3
    Dernier message: 22/07/2005, 13h34

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