Pouvez-vous me dire comment faire, svp ?
Pouvez-vous me dire comment faire, svp ?
Chaque jour, il y a 30 Morts sur les routes......roulons sur les trottoirs
Athlon XP 3000+, A7N8X-E Deluxe, 512 Mb DDR, Radeon 9600 Pro 256 Mb, 160 Gb.
Convertir un TStrings en char* c'est ça ? Peut être la méthode GetText ?
j'aimerais convertir le texte d'un mémo en char*
Chaque jour, il y a 30 Morts sur les routes......roulons sur les trottoirs
Athlon XP 3000+, A7N8X-E Deluxe, 512 Mb DDR, Radeon 9600 Pro 256 Mb, 160 Gb.
Utilise la méthode c_str de la classe String
Steve
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 char* cp = Memo1->Text.c_str()
Modérateur Taverne et C++Builder
Règles du Club - Règles de la Taverne
FAQ BCB - sources
Et je mords
Ho le CON (je parle de moi)
Chaque jour, il y a 30 Morts sur les routes......roulons sur les trottoirs
Athlon XP 3000+, A7N8X-E Deluxe, 512 Mb DDR, Radeon 9600 Pro 256 Mb, 160 Gb.
Bonjour,
Attention !!!!Envoyé par Superstivix
Ce code est faux ! Il marche, mais le pointeur fourni par c_str() n'est valide qu'au moment de l'appel à c_str(). Autrement dit, dès la ligne suivante, le comportement est indéfini.
Il faut utiliser un strcopy pour copier la chaine pointée par le c_str() dans une zone mémoire allouée pour l'occasion, et pointée par cp.
Cordialement,
Arnaud
A lire : Les règles du forum
Faux ??Envoyé par Greybird
Chez moi ça marche très bien et de plus il est écrit tel quel dans l'aide de C++Builder5 sur c_str()
Tu as peut-être raison Arnaud mais si on ne peut plus faire confiance au code qui est écrit dans l'aide de Builder ou vas t'on??
Steve
Modérateur Taverne et C++Builder
Règles du Club - Règles de la Taverne
FAQ BCB - sources
Et je mords
Envoyé par L'aide de C++ Builder
A lire : Les règles du forum
Autant pour moi, lors de mon utilisation première de c_str() j'avais du mal lire
Toutefois, dans mon programme je n'ai aucun problème
Modérateur Taverne et C++Builder
Règles du Club - Règles de la Taverne
FAQ BCB - sources
Et je mords
Salut !
Ca dépend peut-être des versions BCB...Moi j'ai BCB3 Pro:
Si la durée de vie du tableau est limité à l'appel .c_str() dans ce cas,Renvoie un pointeur sur un tableau de caractères à zéro terminal contenant
les mêmes caractères que l'AnsiString.
tu ne peux jamais rien copier puisqu'il se détruirait juste après !
A plus !
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 AnsiString Nom = "LeMien"; char Buffer[1024]; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { char *temp = Nom.c_str(); //temp ne serait donc plus valable à partir d'ici ! int le = strlen(temp); //devrait renvoyer une erreur puisque temp a été libéré CopyMemory(Buffer,temp, le + 1); //devrait générer une erreur ou copier n'importe quoi //Buffer contiendrait tout sauf mon nom ! Panel1->Caption = temp; //ça fait plus de quelques µs que temp n'existe plus ! //Ici ça devrait faire n'importe quoi ! Panel1->Caption = Panel1->Caption + " " + IntToStr(le); //Et bien contrairement à ce qui a été dit //Panel1 montre bien "LeMien 6" !!!! Label1->Caption = temp; //et bien oui... temp est toujours valide ! //Normalement BCB devrait libérer son propre tableau temp ici... non ???? } //---------------------------------------------------------------------------
Bonjour,
2 remarques :
1 - Il n'est plus valide à l'instruction suivant celle dans laquelle il est inséré.
2 - plus valide ne veut pas dire que le contenu a changé. Néanmoins, on n'est pas sûr du contenu...
Cordialement,
Arnaud
A lire : Les règles du forum
d'apres le code de c_str() dans la VCL, le pointeur est toujours valide dans les instructions suivant celle dans laquelle il est inséré.
En revanche il ne serait plus valide à la sortie de la fonction dans laquelle l'Ansistring a été déclarée
voici le code de l'ansistring (fichier dstring.h) :
donc Data est un char *, donnée membre de l'AnsiString dont la durée de vie est exactement celle de l'ansistring qui la contient.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 private: // assert(offsetof(AnsiString, Data) == 0); char *Data; // [...] char* __fastcall c_str() const { return (Data)? Data: "";}
en gros
marchera tout le temps puisque l_string n'a pas été détruite
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 void fonction() { AnsiString l_string = "tutu"; char * l_ptr = l_string.c_str(); cout << l_ptr << std::endl; Panel1->Caption = l_ptr; Label1->Caption = l_ptr; }
en revanche
peut très bien marcher pendant une semaine et planter la semaine suivante ou sur un autre ordi, car l_string a été détruite et son espace mémoire a pu etre réalloué pour qqc d'autre apres la sortie de fonction
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 char * fonction() { AnsiString l_string = "tutu"; char * l_ptr = l_string.c_str(); return l_ptr; } void main() { char * l_temp = fonction(); std::cout << l_temp << std::endl; }
- http://jeg.developpez.com
- Projet RPGen : Editeur d'environnement de simulation de mondes régis par intelligence artificielle, interagissant avec le joueur. Peut faire office d'éditeur de RPG en 2D. http://jegsbond.free.fr/RPGen/ (Cherche testeurs)
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager