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 :

Cast CString vers void*


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Par défaut Cast CString vers void*
    Bonjour à tous,

    Je dois retourner l'adresse d'un CString et le stocker dans un pointeur. Mon code est basé sur un code précédent qui à la place d'un CString utilisait un wstring. Mon code est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_pValue =  &(p_pBean->getText());
    getText() me renvoyait donc à l'origine un wstring et dans mon code me renvoit un CString. Seulement voilà, je ne peux pas écrire à l'adresse stockée dans le pointeur (void *). Dès que j'écris quelque chose à cette adresse, j'ai le droit à un beau plantage en règle .
    Une de mes pistes est que Wstring est une structure et donc que le & me renvoit bien l'adresse de la structure alors qu'un CString est une chaîne de caractère donc déjà un pointeur et qu'avec le code utilisé, je retourne un pointeur de pointeur...
    Seulement si j'utilise ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_pValue = p_pBean->getText();
    La compilation me retourne une erreur de cast "cannot convert CString to void*".
    Commençant à m'embrouiller dans tout ça (et étant débutant), je demande un peu d'aide

    Merci d'avance!


    Edit : Je précise (même si je ne pense pas que ça ait un interêt que lorsque je passe mon attribut text en public et que je fait un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_pValue =  &(p_pBean->text);
    Ca fonctionne parfaitement.

  2. #2
    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 : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    getText() te retourne un CString. C'est une classe où les données sont stockées quelque part dans la nature. De plus, il est vraisemblable qu'il s'agisse d'un passage par valeur, donc getText retourne un objet, tu en prends l'adresse, mais l'objet est détruit à la sortie de ta fonction.
    Tu devrais donc stocker un CString (comme tu aurais dû stocker un wstring aussi) et non un pointeur vers ces objets.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Par défaut
    Merci de ta réponse.
    Cependant, je ne suis pas sûr d'avoir tout compris

    GetText() me retourne bien un objet de type CString, ça je suis d'accord. J'en prend bien l'addresse puisque c'est à cette adresse que je veux ensuite écrire mais je ne comprends pas très bien quand tu dis que l'objet est détruit à la sortie de la fonction. Ce qui m'intéresse c'est juste l'adresse de l'objet...

  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 : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Alors tu ne travailles pas correctement. getText() te renvoie un objet (on ne sait pas l'objet sur lequel tu appelles getText, mais vu le nom de la méthdoe, je ne me trompe pas) soit constant, soit une copie.
    - si c'est un objet constant, tu ne peux pas changer le texte à l'intérieur
    - si c'est uen copie, changer sa valeur ne changera pas le texte dans ton premier objet.

    getText() n'est pas fait pour être une méthode qui retourne un objet modifiable dans tous les cas. Si tu veux modifier le texte, fait un getText puis un setText. Travaille proprement.

    Enfin, si tu ne comprends pas pourquoi tu devrais stocker le retour de getText dans un objet plutôt que dans un pointeur, regarde les premiers cours de C++ que tu as eu sur les tableaux internes à une fonction et ce qui se passe quand on les retourne.

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    On fait le pari que tu as quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    //p_pBean->getText()
    CString CMonBean::getText()
    {...}
    Donc, quant tu écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_pValue =  &(p_pBean->getText());
    tu récupères l'adresse d'une variable temporaire CString utilisée pour le retour de ta fonction. Cette variable temporaire est ensuite détruite et ton adresse est invalide!

    La solution pourrait être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CString* CMonBean::getText()
    Mais, excuses-moi, au vue de ton niveau, je pense que cela est très dangereux. Peut-être devrais tu revoir ta conception: as-tu vraiment besoin de l'adresse de CString (est-ce pour modifier la valeur)? Comment articules-tu la durée de vie de p_pBean et celle de m_pValue?

Discussions similaires

  1. cast float vers int
    Par planeur2007 dans le forum C
    Réponses: 5
    Dernier message: 13/03/2007, 18h39
  2. Cast string vers vertor<string>
    Par franc82 dans le forum C++
    Réponses: 4
    Dernier message: 10/11/2006, 00h03
  3. [MFC] CString vers const char*
    Par Rafoo dans le forum MFC
    Réponses: 9
    Dernier message: 17/06/2006, 15h43
  4. [MFC - ATL] CString vers const char *
    Par VitamineC dans le forum MFC
    Réponses: 2
    Dernier message: 12/04/2006, 18h56
  5. [MFC] Problème de conversion CString vers Char *
    Par Darkenshin dans le forum MFC
    Réponses: 10
    Dernier message: 02/12/2005, 14h42

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