begin process at 2012 05 28 07:19:55
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Allocation dynamique de char* ....


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

Administrateur CodeS-SourceS
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

Administrateur CodeS-SourceS
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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,279 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales