Précédent   Forum des professionnels en informatique > C et C++ > C++
C++ Forum d'entraide technique sur le langage C++. Avant de poster -> F.A.Q C++
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/02/2012, 20h41   #1
Futur Membre du Club
 
Inscription : janvier 2011
Messages : 74
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 74
Points : 15
Points : 15
Par défaut Stack problème avec push

Bonjour tout le monde,


je dois réaliser une pile en c++ pour mon TP et je bloque au niveau de la méthode push, cette dernière doit empiler un element (entier e) et renvoyer son index dans la pile

voilà ce que j'ai fais

Stack.cpp
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
#include "Stack.hpp"
 
Stack::Stack(int n)
{
	current=0;
	size=n;
	container=new int(n);
}
int Stack::push(int e)
{
 
	container[current++]=e;
	size++;
 
return -1;//là je sais pas cmt faire pour renvoyer l'indice apres l'ajout
 
}
 
Stack::Stack(const Stack& s)
{
	size=s.size;
        current=s.current;
 
for(int i=0;i<s.current;i++)
{
	container[i]=s.container[i];
}
}

Stack.hpp

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
#include<stdlib.h>
#include<iostream>
 
class Stack{
	public:
		int current;
		int* container;
		int size;
	public:
		Stack(int n);
		Stack(const Stack& s);
		void push(int e);
};

main.cpp


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include"Stack.cpp"
 
using namespace std;
int main()
{
	Stack s1(3);
	s1.push(3);
	s1.push(5);
 
	for(int i=0;i<s1.size; i++)
{
	cout << s1.container[i] << endl;
 
}
return 1;
}
à l'execution ça m'affiche:

3
5
0
135153
0

et si je met Stack s1(1) au lieu de 3, ça m'affiche
3
5
0
je pense que j'ai un problème au niveau du constructeur?
Quelqu'un peut m'aider?

Merci
javast est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 01h27   #2
Membre Expert
 
Inscription : août 2004
Messages : 1 202
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 1 202
Points : 1 427
Points : 1 427
Envoyer un message via MSN à Klaim
Il y a plus de soucis avec ton code mais étant un débutant j'imagine que c'est moins important que la question qui nous concerne. Dans le constructeur:

Ici tu crées un seul et unique entier, pas un tableau, donc tous tes autres accçs mémoires sont en dehors de ton tableau la plupart du temps puisque ce n'en est pas un.


Code :
container=new int[n]; // ou int[n](); pour les initialiser à 0 dés le départ
Ca devrait au moins fixer ce problème.

Il se peut qu'il y en ai d'autres mais règle déjà ça et ça va t'aider. Vérifie que tu comprends bien la syntaxe de new aussi.
Klaim est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/02/2012, 10h32   #3
Futur Membre du Club
 
Inscription : janvier 2011
Messages : 74
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 74
Points : 15
Points : 15
Citation:
Envoyé par Klaim Voir le message
Il y a plus de soucis avec ton code mais étant un débutant j'imagine que c'est moins important que la question qui nous concerne. Dans le constructeur:

Ici tu crées un seul et unique entier, pas un tableau, donc tous tes autres accçs mémoires sont en dehors de ton tableau la plupart du temps puisque ce n'en est pas un.


Code :
container=new int[n]; // ou int[n](); pour les initialiser à 0 dés le départ
Ca devrait au moins fixer ce problème.

Il se peut qu'il y en ai d'autres mais règle déjà ça et ça va t'aider. Vérifie que tu comprends bien la syntaxe de new aussi.
Merci Klaim pour ta réponse, j'ai essayé ce que tu ma dis mais ça marche pas ça compile plus, voilà ce qu'il m'affiche comme erreur mnt

main.cpp.text+0x19): undefined reference to `Stack::Stack(int)'
main.cpp.text+0x2d): undefined reference to `Stack::push(int)'
main.cpp.text+0x41): undefined reference to `Stack::push(int)'
javast est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 10h57   #4
Membre Expert
 
Homme
Junior developer C/C++/Embedded system
Inscription : juin 2010
Messages : 656
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Junior developer C/C++/Embedded system

Informations forums :
Inscription : juin 2010
Messages : 656
Points : 1 371
Points : 1 371
Bonjour,

quelles modification as-tu faîtes pour qu'il ne compile plus ?
La seule modification indiquée ci-dessus ne peut pas avoir cet effet.
Bousk est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/02/2012, 11h00   #5
Futur Membre du Club
 
Inscription : janvier 2011
Messages : 74
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 74
Points : 15
Points : 15
Citation:
Envoyé par javast Voir le message
Merci Klaim pour ta réponse, j'ai essayé ce que tu ma dis mais ça marche pas ça compile plus, voilà ce qu'il m'affiche comme erreur mnt

main.cpp.text+0x19): undefined reference to `Stack::Stack(int)'
main.cpp.text+0x2d): undefined reference to `Stack::push(int)'
main.cpp.text+0x41): undefined reference to `Stack::push(int)'
C'est bon ça compile maintenant, mais j'ai toujours le même affichage qu'avant ça n'a rien changer

Merci
javast est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 12h03   #6
Membre Expert
 
Inscription : août 2004
Messages : 1 202
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 1 202
Points : 1 427
Points : 1 427
Envoyer un message via MSN à Klaim
D'abord, tu augmentes la size quand tu ajoutes un élément mais tu la mets dés le départ au maximum. Ce n'est pas logique du tout. Soit ta taille est celle maximale, soit c'est le nombre d'élément en cours, soit 0 au départ.

Dans tous les cas, ton problèem c'est que ta boucle qui affiche le contenu de ton array a de mauvaises informations (la size est n'importe quoi) et lis donc des données qui ne sont pas dans ton tableau.

Bon courage.


Corrige la logique de ton code, une fois fait je peux te montrer comment le faire en plus "safe".
Klaim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 09h29   #7
Futur Membre du Club
 
Inscription : janvier 2011
Messages : 74
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 74
Points : 15
Points : 15
Citation:
Envoyé par Klaim Voir le message
D'abord, tu augmentes la size quand tu ajoutes un élément mais tu la mets dés le départ au maximum. Ce n'est pas logique du tout. Soit ta taille est celle maximale, soit c'est le nombre d'élément en cours, soit 0 au départ.

Dans tous les cas, ton problèem c'est que ta boucle qui affiche le contenu de ton array a de mauvaises informations (la size est n'importe quoi) et lis donc des données qui ne sont pas dans ton tableau.

Bon courage.


Corrige la logique de ton code, une fois fait je peux te montrer comment le faire en plus "safe".

C'est bon j'ai réglé le problème merci beaucoup, là je vais attaquer les autres fonctions, et si je bloque je te demande
javast est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 13h28   #8
Membre Expert
 
Inscription : août 2004
Messages : 1 202
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 1 202
Points : 1 427
Points : 1 427
Envoyer un message via MSN à Klaim
Ok!

Mais je te préviens, ton code actuel est "dangereux". Un professionnel décent n'écrirais pas ça comme ça. Si tu veux je te fais un équivalent plus safe dés que j'ai quelques minutes.
Klaim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 19h59   #9
Futur Membre du Club
 
Inscription : janvier 2011
Messages : 74
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 74
Points : 15
Points : 15
Citation:
Envoyé par Klaim Voir le message
Ok!

Mais je te préviens, ton code actuel est "dangereux". Un professionnel décent n'écrirais pas ça comme ça. Si tu veux je te fais un équivalent plus safe dés que j'ai quelques minutes.
Oui s'il te plait, merci beaucoup
javast est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 11h58   #10
Membre expérimenté
 
Homme Léo Gaspard
Lycéen
Inscription : janvier 2012
Messages : 342
Détails du profil
Informations personnelles :
Nom : Homme Léo Gaspard
Localisation : France

Informations professionnelles :
Activité : Lycéen

Informations forums :
Inscription : janvier 2012
Messages : 342
Points : 575
Points : 575
Un professionnel décent écrirait typedef std::stack<int> Stack; ...
Ekleog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 12h19   #11
Membre éprouvé
 
Homme Eric
Inscription : décembre 2010
Messages : 254
Détails du profil
Informations personnelles :
Nom : Homme Eric
Localisation : France

Informations forums :
Inscription : décembre 2010
Messages : 254
Points : 450
Points : 450
Citation:
Envoyé par Ekleog Voir le message
Un professionnel décent écrirait typedef std::stack<int> Stack; ...
Pas faux, mais il reste quand même quelques logiques et structures de données qui ne sont déjà pas écrites...et quand on l'écrit il vaut mieux coder proprement...
therwald est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 18h25   #12
Membre expérimenté
 
Homme Léo Gaspard
Lycéen
Inscription : janvier 2012
Messages : 342
Détails du profil
Informations personnelles :
Nom : Homme Léo Gaspard
Localisation : France

Informations professionnelles :
Activité : Lycéen

Informations forums :
Inscription : janvier 2012
Messages : 342
Points : 575
Points : 575
Citation:
Envoyé par therwald Voir le message
Pas faux, mais il reste quand même quelques logiques et structures de données qui ne sont déjà pas écrites...et quand on l'écrit il vaut mieux coder proprement...
Un exemple ? (Excepté si on parle de plus de contrôle sur la façon dont les données sont agencées : si on veut un B-tree p.ex, oui, il n'y en a pas, mais ça s'utilise comme une map. D'ailleurs, il doit sûrement y avoir un moyen d'en trouver un dans une bibliothèque !)
Ekleog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2012, 09h04   #13
Membre éprouvé
 
Homme Eric
Inscription : décembre 2010
Messages : 254
Détails du profil
Informations personnelles :
Nom : Homme Eric
Localisation : France

Informations forums :
Inscription : décembre 2010
Messages : 254
Points : 450
Points : 450
Citation:
Envoyé par Ekleog Voir le message
Un exemple ?
N'importe quelle structure de données complexe spécifique au métier d'un logiciel donné, qui est construite en assemblant des structures standard...
therwald est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/02/2012, 18h29   #14
Membre expérimenté
 
Homme Léo Gaspard
Lycéen
Inscription : janvier 2012
Messages : 342
Détails du profil
Informations personnelles :
Nom : Homme Léo Gaspard
Localisation : France

Informations professionnelles :
Activité : Lycéen

Informations forums :
Inscription : janvier 2012
Messages : 342
Points : 575
Points : 575
Citation:
Envoyé par therwald Voir le message
N'importe quelle structure de données complexe spécifique au métier d'un logiciel donné, qui est construite en assemblant des structures standard...
(italique ajouté par mes soins)
Si la structure est spécifique au métier d'un logiciel donné, elle n'a rien à faire dans la SL, en effet.
Et, en général, les structures particulières (enfin, toutes celles que j'ai pu rencontrer dans ma vie professionnelle inexistante pour le moment) se résument plus ou moins à des choses du genre :
Code :
1
2
3
4
5
6
 
using namespace std; // Paresse oblige, il va y en avoir un bon nombre - je sais, mauvaise pratique
typedef vector<int> vec;
typedef set<int> my_set;
typedef map<MyObject, int> value_map;
// etc.
Les problèmes de structures arrivant souvent avec la suite, dont les "first" et "second" ne sont pas des bons noms :
Code :
1
2
 
typedef map<int, pair<int, int> > graph; // map vertex_from_id / <vertex_to_id, cost>
La solution se résumant généralement à une struct arete { int to, cost; };.

Et, si il y a vraiment besoin d'objets métiers spécifiques, alors la qualité du code aura rarement besoin d'être idéale : ce serait un simple wrapper, donc pas de problème de new / delete.
Ekleog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2012, 18h46   #15
Membre éprouvé
 
Homme Eric
Inscription : décembre 2010
Messages : 254
Détails du profil
Informations personnelles :
Nom : Homme Eric
Localisation : France

Informations forums :
Inscription : décembre 2010
Messages : 254
Points : 450
Points : 450
Elle aura besoin d'être bien codée
1) en utilisant les structures standards comme blocs de base partout où on peut pour ne pas prendre le risque de mal recoder ce qui existe déjà
2) en faisant attention à la gestion mémoire (utiliser les smart pointers quand de l'allocation dynamique est nécessaire, minimiser au maximum l'utilisation de l'allocation dynamique...)

Parce que tu ne dois pas laisser ta représentation des données devenir le maillon faible de ton programme et t'introduire des bugs ingérables...
therwald est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h53.


 
 
 
 
Partenaires

Hébergement Web