2012-10-08 4 views
0

J'ai un CEdit et je veux extraire les données en utilisant ceci.C++ perte de variables

wchar_t *temp = (wchar_t*)dialog.editbox.GetBuffer(0); 
dialog.editbox.ReleaseBuffer(); 

Maintenant, je veux enregistrer ce texte dans un pointeur d'objet comme celui-ci:

selectedShape->setText(temp); 

Ce travail parfait, mais seulement aussi longtemps que vous êtes dans le champ d'application de la méthode, parce que quand je fais un fichier sauvegardé plus tard, le texte n'est plus dans l'objet.

Est-ce que quelqu'un sait comment je peux enregistrer ce wchar_t* pour plus tard?

+1

Quantifier « pour plus tard. » –

+0

Dans une autre méthode. selectedShape est un pointeur qui est utilisé dans toute l'application. – HansElsen

+3

La documentation indique "[Utiliser' ReleaseBuffer' pour mettre fin à l'utilisation d'un tampon alloué par 'GetBuffer'.] (Http://msdn.microsoft.com/en-us/library/aa300574 (v = vs.60). aspx). " Vous utilisez le tampon après l'avoir relâché. Si vous souhaitez conserver le tampon valide, ne libérez pas votre seule copie. –

Répondre

1

Le pointeur temp pointe vers des données hors de portée, vous devez donc allouer dynamiquement de la mémoire pour stocker la valeur. Quelque chose comme cela devrait fonctionner:

// Updated to use wstring, thanks praetorian 
std::wstring tempStr((wchar_t*)dialog.editbox.GetBuffer(0)); 

Ou:

int length = /*figure out the length here*/; 
wchar_t *temp = new wchar_t[length]; 
memcpy(temp, dialog.editbox.GetBuffer(0), length*sizeof(wchar_t)); 
// dont forget to delete it like this: delete [] temp; 
+0

'std :: string' pour contenir un tampon' wchar_t'? Essayez 'std :: wstring' – Praetorian

+0

Salut merci pour le commentaire. C'est pour un projet d'école et je suis obligé d'utiliser seulement char * et wchar_t *. EDIT: Oh, je vois votre édition. Essayer maintenant – HansElsen

+0

@HansElsen Ils enseignent * MFC à l'école *? O noes. Bjarne Stroustrup se lamentait récemment dans une présentation qu'il allait aller dans des endroits et qu'ils n'avaient pas mis à jour leurs cours au-delà de [Turbo C++] (http://en.wikipedia.org/wiki/Turbo_C%2B%2B) ... mais c'est probablement encore plus malavisé! – HostileFork

2

Comme @ prétorienne dit, votre code semble manquer une étape où vous travaillez avec une classe CString dont le tampon de vous obtenez.

http://msdn.microsoft.com/en-us/library/aa314880(v=vs.60).aspx

Si possible, évitez d'utiliser des solutions de mémoire dynamique. Au lieu de cela, passez votre valeur temp en tant qu'objet CString qui gérera sa propre mémoire. Les fonctions de fenêtre de stock setText prennent des pointeurs de chaîne (que CString peut implicitement convertir) et copient les données de chaîne sous-jacentes. Si vous écrivez vos propres objets, maintenez CString objets en tant que membres par valeur.

(je vais ajouter mes habituels « Les années 90 ont appelé, ils veulent que leur cadre arrière » disclaimer ici. Try Qt.)

+0

+1 pour la réponse, et un autre +1 pour le commentaire sur les années 90 et leur cadre, et un autre +1 pour suggérer Qt! :) – Brady

+1

Ne sont pas ceux + 1/3rds? :) Essayez de faire aussi peu de calcul arithmétique brut et tel que vous pouvez ... partout où vous voyez 'memcpy' vous utilisez des techniques de style C et non C++. Il y a de nouveaux trucs qui le rendent plus efficace; C++ 11 peut même renvoyer une structure de données géante par valeur et sait la "déplacer" au lieu de la "copier". Je suggère de prendre un moment pour lire ce court article: http://www.stroustrup.com/new_learning.pdf – HostileFork