[C++] je pete les plombs la

je pete les plombs la [C++] - Programmation

Marsh Posté le 21-02-2002 à 18:28:22    

voila je veux creer une pile toute simple de caractere  
et obtenir ainsi tous les element de la pile de caractere dans une chaine de caractere. Ca a l'air simple. Je m'execute mais ce putain de compilateur me prend systematiquement dans ma chaine de caractere a la fin ²²²²... Pourtant j'ai pas l'impression que j'ai fait une erreur j'ai retourné le code dans tous les sens mais non il m'affiche toujours ce que je demande + les fameux ²²²².
je vous donne mon code
et vous remercie d'avance
ne vous souciez pas des #include  
void main()
{
 CPile P;
 P.Empiler('0';);
 P.Empiler('1';);
 cout<<P.getpile()<<endl;
}
 
et la declaration de classe  
class CPile
{
 private:
 
  char m_iPile[8];//Pile !!!
  int m_iCount;//nb d'element ds la pile
 public:
  CPile(); //creer pile
  bool Vide();//si vide
  bool Pleine();//si pleine
  char* getpile(); // obtenir la valeur de tous les elements de la pile
  void Empiler(char c);
  void Depiler();
 
};
 
 
//methodes de la classes CPile
CPile::CPile()
{
 m_iCount=0;
}
 
bool CPile::Vide()
{
 return (m_iCount==0);
}
 
bool CPile::Pleine()
{
 return (m_iCount==8);
}
 
char* CPile::getpile()
{
 char * temp;
 temp = new char [m_iCount];
 
 for (int i=0;i<m_iCount;i++)
  temp[i]=m_iPile[i];
 
 return temp;
}
 
void CPile::Empiler(char c)
{
 m_iCount ++;
 
 m_iPile[m_iCount-1]=c;
}
 
void CPile::Depiler()
{
 m_iCount--;
}

Reply

Marsh Posté le 21-02-2002 à 18:28:22   

Reply

Marsh Posté le 21-02-2002 à 18:44:05    

Tu as oublié le zéro terminateur de la chaine dans ta méthode getPile().
 
De plus cette méthode crée une chaine mais ne la libere pas donc ça va être à la charge de l'appelant de faire le delete.
Disons qu'il faut au moins changer le nom de la méthode.


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 21-02-2002 à 18:48:20    

Ah oui evite de mettre des valeur numerique tel "8". Le jour où tu veux changer cette limite, tu seras dans la merde. Utilise des constantes (statique ou enumeré ou parametre dans le constructeur)
 
le new char[m_iCount] n'est pas correct, il ne tient pas compte du zéro terminateur. Le proto ne sont pas complets (comme Vide() ou Pleine())
 
bool CPile::Vide() const par exemple


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 21-02-2002 à 19:00:40    

merci bcp pour ton aide
mais je ne comprends pas bien a quoi vont me servir les const devant pleine et vide ?

 

[jfdsdjhfuetppo]--Message édité par Rob Roy--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 21-02-2002 à 19:31:11    

Pour le const devant Vide ou Pleine, cela sert à dire que la fonction peut-etre appelée sur un objet constant : ie elle ne le modifie d'aucune facon. Ca a l'air de rien comme ca et ca te semble peut-etre inutile, mais prend l'habitude de mettre ce const absolument partout ou c'est possible. Sinon, tu auras des problemes plus tard avec les passages de paramètres par references et autres joyeusetés de ce genre :)

Reply

Marsh Posté le 21-02-2002 à 20:01:06    

ex:

Code :
  1. class A {
  2.   bool Vide();
  3. }
  4. bool Mafonction(const A& a) {
  5.   if (a.Vide()) {
  6.     // Erreur ici parce que a est une reference const
  7.     // et donc on ne peut appeler que des methodes const  
  8.   }
  9. }


C'est une contrainte mais c'est
egalement une protection.
Evidemment c'est au programmeur de fixer
la semantique du const..
(rien ne t'interdit de definir Vide() const
et de changer l'etat interne de ton objet
dans ta methode)
 
Le passage par reference n'est pas toujours gagnant
a toi de voir si le surcout de copie de l'objet
(superficielle ou en profondeur)  
surpasse le fait de devoir acceder
constamment a cet objet par un pointeur.
exemple: passer un simple entier par reference est
une idee stupide. Passer une matrice par reference
est plus intelligent. Mais parfois tu es tout
de meme oblige de copier ta matrice pour pouvoir faire
des operations dessus, donc autant la passer
par valeur la premiere fois. De meme le fait
de passer un entier par reference permet
de modifier la valeur de l'entier d'origine
depuis la fonction et donc la reference s'impose.
 
A+
LEGREG

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed