Pile c++
Résolu/Fermé
javast
Messages postés
75
Date d'inscription
mardi 20 avril 2010
Statut
Membre
Dernière intervention
14 février 2013
-
13 déc. 2011 à 10:44
javast Messages postés 75 Date d'inscription mardi 20 avril 2010 Statut Membre Dernière intervention 14 février 2013 - 10 févr. 2012 à 21:07
javast Messages postés 75 Date d'inscription mardi 20 avril 2010 Statut Membre Dernière intervention 14 février 2013 - 10 févr. 2012 à 21:07
2 réponses
Char Snipeur
Messages postés
9696
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 297
13 déc. 2011 à 11:36
13 déc. 2011 à 11:36
Salut
Le problème du C++ c'est la gestion de la mémoire. Soit tu fais des listes chainées, ça évite de gérer la mémoire, mais ça prend de la place mémoire, pour un type intégrale, mais s'avère utile pour des objets volumineux.
Le parti prit de faire un tableau est bien mais nécessite de gérer la mémoire. En général ce qui est fait c'est de dimensionner trop grand, car si tu doit redimensionner ton tableau à chaque nouvel élément, tu perds du temps en copie (et oui, ce n'est pas possible d'étendre un tableau).
Mais sinon tu es bien parti. Je te conseil donc d'avoir 2 variables : une variable size qui est la taille réelle du tableau et une variable lenght qui est le nombre de données dans la pile. Ensuite, à chaque fois qui tu ajoutes un élément tu vérifies les deux tailles, et si tu manques de place tu fait un tableau plus grand et tu copies tes donner dedans avant de détruire le premier.
Le problème du C++ c'est la gestion de la mémoire. Soit tu fais des listes chainées, ça évite de gérer la mémoire, mais ça prend de la place mémoire, pour un type intégrale, mais s'avère utile pour des objets volumineux.
Le parti prit de faire un tableau est bien mais nécessite de gérer la mémoire. En général ce qui est fait c'est de dimensionner trop grand, car si tu doit redimensionner ton tableau à chaque nouvel élément, tu perds du temps en copie (et oui, ce n'est pas possible d'étendre un tableau).
Mais sinon tu es bien parti. Je te conseil donc d'avoir 2 variables : une variable size qui est la taille réelle du tableau et une variable lenght qui est le nombre de données dans la pile. Ensuite, à chaque fois qui tu ajoutes un élément tu vérifies les deux tailles, et si tu manques de place tu fait un tableau plus grand et tu copies tes donner dedans avant de détruire le premier.
Char Snipeur
Messages postés
9696
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 297
9 févr. 2012 à 21:08
9 févr. 2012 à 21:08
essai "Pile s2(s1);"
C'est erreur est vraiment étrange. Je ne l'ai jamais vu. Ça ressemble à une erreur système, mais tes variables ont vraiment trop petites pour générer de telles erreurs.
Es tu sur que s.size>0 ? affiche pour vérifier. Ça semble crétin comme remarque, mais à part ça, je ne vois pas ce qui pourrait générer une erreur dans malloc. À tout hasard, met ta fonction push.
C'est erreur est vraiment étrange. Je ne l'ai jamais vu. Ça ressemble à une erreur système, mais tes variables ont vraiment trop petites pour générer de telles erreurs.
Es tu sur que s.size>0 ? affiche pour vérifier. Ça semble crétin comme remarque, mais à part ça, je ne vois pas ce qui pourrait générer une erreur dans malloc. À tout hasard, met ta fonction push.
javast
Messages postés
75
Date d'inscription
mardi 20 avril 2010
Statut
Membre
Dernière intervention
14 février 2013
1
9 févr. 2012 à 21:34
9 févr. 2012 à 21:34
j'ai déjà essayer Pile s2(s1) au début, sans aucun chagement
voilà exactement ce je fais dans mon main
#include "Pile.cpp"
using namespace std;
int main()
{
Pile s1(4);
s1.push(3);
s1.push(5);
s1.push(7);
s1.push(9);
//Pile s2=s1; // là j'ai une erreur
for(int i=0;i<s1.size; i++)
{
cout << s1.conteneur[i] <<endl; //affiche le contenu de la pile
}
return 1;
}
fonction push
int Pile::push(int e)
{
int a=0;
if(currentElt<size)
{
conteneur[current]=e;
a=currentElt;
currentElt++;
}
else{
cout << "la Pile est pleine le " << e << " n est pas inserer"<< endl;
a= -1;
}
return a;
}
Constructeur
Pile::Pile(int n)
{
currentElt=0;
size=n;
conteneur=new int[0];
}
voilà exactement ce je fais dans mon main
#include "Pile.cpp"
using namespace std;
int main()
{
Pile s1(4);
s1.push(3);
s1.push(5);
s1.push(7);
s1.push(9);
//Pile s2=s1; // là j'ai une erreur
for(int i=0;i<s1.size; i++)
{
cout << s1.conteneur[i] <<endl; //affiche le contenu de la pile
}
return 1;
}
fonction push
int Pile::push(int e)
{
int a=0;
if(currentElt<size)
{
conteneur[current]=e;
a=currentElt;
currentElt++;
}
else{
cout << "la Pile est pleine le " << e << " n est pas inserer"<< endl;
a= -1;
}
return a;
}
Constructeur
Pile::Pile(int n)
{
currentElt=0;
size=n;
conteneur=new int[0];
}
Char Snipeur
Messages postés
9696
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 297
10 févr. 2012 à 08:15
10 févr. 2012 à 08:15
Houlà ! c'est quoi ce constructeur. C'est bien une chance que tu n'ais pas d'erreur ! Pourquoi l'avoir modifier, le premier constructeur était bon.
conteneur=new int[0];
un tableau de 0 c'est con tout de même.
conteneur=new int[0];
un tableau de 0 c'est con tout de même.
javast
Messages postés
75
Date d'inscription
mardi 20 avril 2010
Statut
Membre
Dernière intervention
14 février 2013
1
10 févr. 2012 à 09:48
10 févr. 2012 à 09:48
non au fait c'est que j'avais des erreurs dans le constructeur, maintenant c'est bon, enlève les []
Pile::Pile(int n)
{
currentElt=-1;
size=n;
conteneur=new int(0);
}
int Pile::push(int e)
{
int a=0;
if(currentElt>=size-1)
{
cout << " Pile pleine"<< endl;
}
else{
currentElt++;
conteneur[current]=e;
a=currentElt;
}
return a;
}
Pile::Pile(int n)
{
currentElt=-1;
size=n;
conteneur=new int(0);
}
int Pile::push(int e)
{
int a=0;
if(currentElt>=size-1)
{
cout << " Pile pleine"<< endl;
}
else{
currentElt++;
conteneur[current]=e;
a=currentElt;
}
return a;
}
Char Snipeur
Messages postés
9696
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 297
10 févr. 2012 à 10:20
10 févr. 2012 à 10:20
non, a bonne façon de faire c'est :
conteneur=new int[n];
sinon tu définis juste une case que tu affectes à 0. C'est en gros équivalent à
new int(0)[1]
conteneur=new int[n];
sinon tu définis juste une case que tu affectes à 0. C'est en gros équivalent à
new int(0)[1]
javast
Messages postés
75
Date d'inscription
mardi 20 avril 2010
Statut
Membre
Dernière intervention
14 février 2013
1
10 févr. 2012 à 11:11
10 févr. 2012 à 11:11
c'est bon ça marche, mrc
par contre j'ai toujour le même problème au niveau du constructeur par copie :(
Merci bcp
par contre j'ai toujour le même problème au niveau du constructeur par copie :(
Merci bcp
13 déc. 2011 à 17:18
Pile::Pile(int n)
{
size=n;
currentElt=0;
conteneur=new int(n);
}
Pile::Pile(const Pile& n)
{
//aucune idée :(
}
13 déc. 2011 à 23:10
7 févr. 2012 à 18:30
Pile::Pile(const Pile& n)
{
size=n.size;
currentElt=n.currentElt;
for(int i=0;i<n.currentElt;i++)
{
conteneur[i]=n.conteneur[i];
}
}
ca compile, j'ai pas encore fais un main, si tu peux m'aider pour faire push
cette dernière doit empiler e et renvoyer son index
Merci
8 févr. 2012 à 08:26
8 févr. 2012 à 18:11