Pas de copie lors de l'affectation entre objets string? [C++] - C++ - Programmation
Marsh Posté le 07-06-2004 à 22:02:46
Bon, j'ai compris l'utilisation de copy mais ca fait aps ce que je veux. Je veux qu'une copie de "Chaine de Caractères" soit placée en mémoire et que chaine2.begin() pointe dessus.
Or, copy ne fait que recopier les caractères à l'emplacement mémoire pointé par chaine2.begin().
Bref, y a quand même un moyen rapide d'effectuer une copie, non ?
Marsh Posté le 07-06-2004 à 22:06:17
blakstaf a écrit : |
string str2 = str1;
Marsh Posté le 07-06-2004 à 22:12:36
Ca pointe sur la même chaine. Modifier l'un revient a modifier l'autre. C'est pas ce que j'appelle une recopie (pas comme je la désire!).
Marsh Posté le 07-06-2004 à 22:13:19
blakstaf a écrit : Ca pointe sur la même chaine. Modifier l'un revient a modifier l'autre. C'est pas ce que j'appelle une recopie (pas comme je la désire!). |
Tu la modifies comment ?
Marsh Posté le 07-06-2004 à 22:14:39
si je fais
chaine2 = "Nouvelle chaine";
chaine1 va egalement me donner "Nouvelle chaine"
Marsh Posté le 07-06-2004 à 22:17:28
Visual C++ 6.0 .
Et comme j'ai un projet a faire en utilisant les MFC windows, j'ai pas trop le choix!
Marsh Posté le 07-06-2004 à 22:20:20
blakstaf a écrit : si je fais |
En C oui, mais en C++, ça m'étonnerait. Tu as essayé ?
Marsh Posté le 07-06-2004 à 22:21:16
ReplyMarsh Posté le 07-06-2004 à 22:21:46
blakstaf a écrit : Ca pointe sur la même chaine. |
Tu utiliserais pas une implémentation de la STL avec un système de copy-on-write des fois ?
Marsh Posté le 07-06-2004 à 22:23:15
kadreg a écrit : Tu utiliserais pas une implémentation de la STL avec un système de copy-on-write des fois ? |
Sauf que là le copy-on-write marche pas
Marsh Posté le 07-06-2004 à 22:24:48
Faut que je fasse du C++ :|
Marsh Posté le 07-06-2004 à 22:29:54
Dion a écrit : Faut que je fasse du C++ :| |
Si tu peux t'en passer, n'h"site pas
Marsh Posté le 07-06-2004 à 22:30:58
kadreg a écrit : Si tu peux t'en passer, n'h"site pas |
Et si j'ai le choix entre C et C++ ?
Marsh Posté le 07-06-2004 à 22:37:02
el muchacho a écrit : Et : |
Ca effectue la même chose.
kadreg > Je sais pas c'est quoi cette histoire de STL avec copy on write.
Comme vous m'aviez mis le doute, j'ai téléchargé la derniere version de la STL sur le site de SGI mais ca n'a malheureusement rien changé.
Marsh Posté le 07-06-2004 à 22:40:14
C'est quand même bizarre cette histoire. Chez vous, faire string chaine1= chaine2 , ca vous fait une recopie complète ?
Marsh Posté le 07-06-2004 à 22:41:04
blakstaf a écrit : Visual C++ 6.0 . |
si tu dois utiliser les MFC, utilise la classe CString et basta.
Marsh Posté le 07-06-2004 à 22:41:19
Bon réflexe, il vaut mieux laisser tomber la STL Microsoft.
Tu te plantes qq part. Tu linkes pas avec la bonne STL, ou tu fais pas du C++ mais du C, j'en sais rien.
Marsh Posté le 07-06-2004 à 22:41:26
Ça ressemble à qq qui fait un c_str() sur une string puis qui retire le const avec un cast
Marsh Posté le 07-06-2004 à 22:42:58
Code :
|
C:\Program Files\Microsoft Visual Studio\MyProjects\taiste\Debug>taiste |
Marsh Posté le 07-06-2004 à 22:44:06
Merci, affaire réglée.
Marsh Posté le 07-06-2004 à 22:46:40
et moi
Marsh Posté le 07-06-2004 à 22:47:47
Dion a écrit : et moi |
En C, on peut faire des truc dégueulasses
En C++, on peut faire largement pire.
Le C++, c'est la zoophilie de l'informatique.
Marsh Posté le 07-06-2004 à 22:50:42
Kristoph a écrit : Ça ressemble à qq qui fait un c_str() sur une string puis qui retire le const avec un cast |
C'est la base du probleme !
Marsh Posté le 07-06-2004 à 22:52:00
blakstaf a écrit : C'est la base du probleme ! |
Bah il faut pas enlever le const.
Marsh Posté le 07-06-2004 à 22:52:28
kadreg a écrit : En C, on peut faire des truc dégueulasses |
Donc je fais koi ? du Java ? :|
Marsh Posté le 07-06-2004 à 22:54:03
ReplyMarsh Posté le 07-06-2004 à 22:56:59
ReplyMarsh Posté le 07-06-2004 à 22:59:49
Je comprends plus trop. j'ai changé une option ds Visual C++. (Project->Settings Onglet C/C++ . j'ai choisi "C++ programs" ds Category a la place de "General". j'ai relancé le prog , étonnant, ca fait une recopie!
Je repasse a General, et la ca fonctionne.
Je suppose qu'il a pas du prendre en compte la derniere version des STL tout à l'heure....
enfin, affaire réglée.
Marsh Posté le 07-06-2004 à 23:07:44
Pour ce qui est du probleme avec les CString, c'est que comme vous le savez, les fonctions en MFC n'acceptent pas en paramètre d'entrée les string mais les CString. Donc je suis obligé de passer par un c_str.
Je récupère donc d'une de mes fonctions un string que je ne veux pas modifier ds une autre variable string qu'on appellera chaine1.
Mais comme la recopie ne s'effectuait pas, quans je passais chaine1.c_str() a la fonction MFC, ca me transtypait mon string original.
Marsh Posté le 07-06-2004 à 23:09:57
Ce n'est pas encore suffisant ! Même si maintenant la recopie se fait, cela ne veux pas dire qu'il est permis de modifier le résultat de c_str().
D'ailleurs, il est formellement interdit de modifier le contenu de c_str()
Marsh Posté le 07-06-2004 à 23:09:59
ça transtype rien du tout: ça te renvoie un pointeur vers une partie de ta string terminée par un 0, en lecture seule, et valable uniquement dans l'expression courante
Marsh Posté le 07-06-2004 à 23:11:46
Ok. Quoi qu'il en soit le problème il vient du fait qu'a la fin du bloc, ca fait appel au destructeur de la classe CString, qui détruit gentiment le string original.
Marsh Posté le 07-06-2004 à 23:17:25
blakstaf a écrit : Ok. Quoi qu'il en soit le problème il vient du fait qu'a la fin du bloc, ca fait appel au destructeur de la classe CString, qui détruit gentiment le string original. |
Quand on vous disais que les MFC c'est de la merde
Au moins quand tu construis ta CString, tu dois pouvoir lui dire de ne jamais desalloué le char * d'origine non ?
Marsh Posté le 07-06-2004 à 21:38:32
Je me suis dit que j'allais laisser tomber les char* pour me mettre aux string de la STL.
Mais il ya quelque chose qui me dérange.
Si je fais :
string chaine1="Ma chaine de caracteres";
string chaine2 = chaine1;
chaine2 et chaine1 pointent tous deux sur "Ma chaine de caractères".
C'est bien gentil tout ca mais moi je veux modifier chaine2 sans pour autant que chaine1 soit modifiée.
En regardant la doc, j'ai vu la fonction membre copy mais je n'arrive pas a bien comprendre comment elle s'utilise.
Un peu d'aide serait bienvenue!