Accueil > Forum > > > > Allocation dynamique de char* ....
Allocation dynamique de char* ....
dimanche 11 décembre 2005 à 11:33:00 |
Allocation dynamique de char* ....

Gendal67
|
Bonjour à tous....
Avant d'acheter un flingue pour de bon, je me suis dit qu'il pourrait etre judicieux de demander de l'aide quelque part... voila, je vais vous exposer le problême. Voici tout d'abord le fragment de code correspondant :
/* Constructeur qui marche bien :) */ String::String(char* chaine) { sz = new char[lstrlen(chaine) + 1]; lstrcpy(sz, chaine); }
/* LE problême vient d'ici !!*/ String DLLEXPORT String::operator=(char* chaine) { Alloc_Buffer(this->sz, lstrlen(chaine) + 1); lstrcpy(this->sz, chaine); return *this; }
/* Peut-etre ce code vous serez utile... */ void String::Alloc_Buffer(char* szBuffer, UINT uSize) { char* chaine = new char[lstrlen(szBuffer) + 1]; lstrcpy(chaine, szBuffer); delete szBuffer; szBuffer = new char[uSize]; lstrcpy(szBuffer, chaine); delete chaine; }
>Voila, donc j'explique maintenant le souci...alors quand j'instancie mon objet de type String avec un char* (fonction 1), et que je l'affiche genre avec cout, tout marche nikel..mais quand je déclare d'abord la variable à blanc (j'ai un constructeur aussi pour ça) puis je lui affecte le char*, ça affiche NADA...
code de traduction :
/* Marche */ String x = "loll";
cout << x.sz << endl;
/* Marche pas!! */ String x;
x = "looll"; cout << x.sz << endl;
voila, merci d'avance...soit de m'aider, soit de confirmer la necessité du flingue -_-"
|
|
dimanche 11 décembre 2005 à 11:52:17 |
Re : Allocation dynamique de char* ....

fredcl
|
Bonjour, void String::Alloc_Buffer(char** szBuffer, UINT uSize) { char* chaine = new char[lstrlen(*szBuffer) + 1]; lstrcpy(chaine, *szBuffer); delete [] *szBuffer; *szBuffer = new char[uSize]; lstrcpy(*szBuffer, chaine); delete chaine; }
Bon j'ai pas le temps de compiler pour vérifier, mais un truc dans ce genre devrais aller mieux. Cordialement Fred Cailleau-Lepetit ( [ Lien ])
|
|
dimanche 11 décembre 2005 à 11:55:47 |
Re : Allocation dynamique de char* ....

Gendal67
|
désolé d'etre nul mais...interet d'avoir un char** plutot qu'un char* ?? je ne calle pas...qu'est-ce qui était faux dans mon code et que tu semblerais avoir rectifié ? Explique moi je suis nul....
|
|
dimanche 11 décembre 2005 à 12:40:33 |
Re : Allocation dynamique de char* ....

vecchio56
|
Parce que tu modifies la valeur du pointeur, tu ne peux donc pas le passer par valeur
|
|
dimanche 11 décembre 2005 à 12:46:48 |
Re : Allocation dynamique de char* ....

Gendal67
|
Jcroyais qu'un passage de char* se faisait toujours par référence et de manière automatique... jvais méditer la dessus...merci...
|
|
dimanche 11 décembre 2005 à 12:52:30 |
Re : Allocation dynamique de char* ....

fredcl
|
Bon pour que tu comprennes oubli que c'est un pointeur imagine que c'est un entier int tu as ta fonction void mafonction(int mavaleur) { mavaleur = 3; } si tu fait a = 2; mafonction(a); cout << a ; cela affichera 2, car la modification de mavaleur n'as pas dépassé la porté de la fonction. si tu as void mafonction(int* mavaleur)
{ *mavaleur = 3;
} l'appel de mafonction(&a); modifiera la valeur de a; maintenant si tu remplace int par char* tu obtiens void mafonction(char** mavaleur) et donc tu pourras modifier l'adresse contenue dans le pointeur (et aussi ce qui se trouve à l'adresse indiqué par le pointeur) J'espère avoir été clair, la notion de pointeur est toujours assez difficile à comprendre au début. Mais avec un peu de persévérence tu finiras par comprendre. Cordialement Fred Cailleau-Lepetit ( [ Lien ])
|
|
dimanche 11 décembre 2005 à 12:53:34 |
Re : Allocation dynamique de char* ....

vecchio56
|
Tu n'a qu'a prendre un exemple simple:
void f(int* x)
{
// x est une variable locale
x = 0;
}
int main()
{
int* x = new int;
f(x);
// ici tu vois bien que x ne vaut pas 0
}
|
|
dimanche 11 décembre 2005 à 18:09:53 |
Re : Allocation dynamique de char* ....

Gendal67
|
Bonsoir
Je vous remercie pour ces explications! fredcl, merci, ton code marche et a résolu le problême! Par contre, je ne pensais pas être débutant avec les pointeurs...je connaissais le systeme d'appel par valeur et par référence avec des types... mais je ne savais pas avec char*... merci à vous deux en tout cas :)
|
|
dimanche 11 décembre 2005 à 21:12:22 |
Re : Allocation dynamique de char* ....

NitRic
|
/* LE problême vient d'ici !!*/ String DLLEXPORT String::operator=(char* chaine) { Alloc_Buffer(this->sz, lstrlen(chaine) + 1); lstrcpy(this->sz, chaine); return *this; }
...
String & DLLEXPORT String::operator = (const char * chaine)
{
...
return *this;
}
avec ton « String DLLEXPORT ... » et ton « return *this » tu vas causer
une copie de ta String, retourne une référence, pas une copie, parce que
tu dois retourner « *this » et non une copie de « *this » ...
tu devrais aussi te faire des méthodes privées pour manager ton buffer
et non l'envoyer un peu n'importe où pour le manager ...
String & DLLEXPORT String::operator = ( const char * la_chaine )
{
size_t len = strlen( la_chaine );
if ( this->_grow( len ) )
{
// copie « la_chaine » dans ton « this->sz » ...
}
return *this;
}
String & DLLEXPORT String::operator = ( const String & str )
{
if ( this->_grow( str.Length() ) )
{
// copie « str » dans ton « this->sz » ...
}
return *this;
}
//...
bool DLLEXPORT String::_grow( size_t new_size )
{
if ( new_size >= this->current_size ) // this->current_size représente l'espace mémoire occupé par this->sz
{
char * new_buff = new char[new_size + EXTRA_SIZE]; // disont que EXTRA_SIZE vaut 8
if ( this->current_size > 0 )
{
if ( this->taille_de_sz > 0 ) // this->taille_de_sz représente le nombre de caractère dans this->sz
{
memcpy(new_buff, this->sz, taille_de_sz);
}
delete [] this->sz;
}
this->sz = new_buff;
this->current_size = new_size;
}
return true;
}
ce n'est qu'un exemple, faut pas faire de copy/paste ...
et n'utilise pas les attributes de ta classe directement!
class String
{
public:
String();
~String();
// ...
const char * getBuffer() const
{
return m_buffer;
}
size_t getLength() const
{
return m_length;
}
// ...
private:
char * m_buffer;
size_t m_length;
// ...
};
~(.:: NitRic ::.)~
|
|
Cette discussion est classée dans : string, chaine, marche, char, szbuffer
Répondre à ce message
Sujets en rapport avec ce message
Convertion d'une string en char [ par redpooka ]
Voici avec ce programme ca n'affiche juste le premier charactère comment faire pour qu'il affiche toute la chaine de caracètre ?Merci#include <iostre
problème d'allocation mémoire dans ma classe [ par Bub325 ]
Salut, j'ai un problème dans le code suivant au niveau de l'allocation mémoire de tmp.a = new char... dans operator+, et je ne sait pas du tout pourqu
string [ par ToToL ]
BonjourComme le dit le sujet j'ai un probleme de string ...... ;-)en fait j'ai un char remplit d'une chaine de caractere avec a un endroit de la chain
chaine de caractères.... [ par Clonk ]
Bonjour,Voilà, j'ai un problème depuis hier sur uen histoire de chaine de caractères... je sais que c'est une erreur bête, mais je n'arrive pas à trou
convertir un string en char* [ par benahpets ]
bonjour tt le monde je débute en C++ et j'aimerai savoir comment faire pour convertir un string en char* (et si cela est possible). merci d'avancestép
String [ par ToToL ]
BonjoursJe cherche un moyen rapide de savoir si deux chaine de caractère sont les meme.J'ai essayer le == et ca me renvoi toujours 0 meme quand les ch
#def [ par xarier ]
salut tous fje voudrait savoir un trucs sur les #defest ce que je peut faire un #def pour une fonction ex : un #def pour cachar* Replace( char* Chain
Conversion de char[] ( C++ non managé ) vers un string ( C# ) [ par LUDINSKI ]
Ben, voilà ! Je me bas depuis quelque heures avec cette conversion...Il faut que je convertisse un tableau de char provenant du C++ ( que je reçois vi
pb de conversion int -> string [ par RoAdBooK ]
Bonjour à tous,Problématique : je souhaite décomposer une date pour obtenir une string de la forme LAAAAMM1.txt (AAAA=année et MM = mois) qui me servi
Un array de string dans le heap ( vaut mieux lire ) [ par Gabi ]
Voila, pour les besoins de mon programme je veux faire un array, d'array de char ( donc de string ) déclarées dans le heap. Voilà donc le bout de code
Livres en rapport
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|