IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Stack problème avec push


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 148
    Points : 62
    Points
    62
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 148
    Points : 62
    Points
    62
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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)'

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    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.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 148
    Points : 62
    Points
    62
    Par défaut
    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

  6. #6
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    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".

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 148
    Points : 62
    Points
    62
    Par défaut
    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

  8. #8
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    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.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 148
    Points : 62
    Points
    62
    Par défaut
    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

  10. #10
    Membre éclairé
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    Un professionnel décent écrirait typedef std::stack<int> Stack; ...

  11. #11
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    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...

  12. #12
    Membre éclairé
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    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 !)

  13. #13
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    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...

  14. #14
    Membre éclairé
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  15. #15
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    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...

Discussions similaires

  1. [Flex3] pseudo Push flex/php et problème avec URLloader
    Par ouaqa dans le forum Flex
    Réponses: 4
    Dernier message: 17/09/2010, 13h19
  2. Problème avec Push et Length
    Par minette dans le forum Ruby
    Réponses: 8
    Dernier message: 12/01/2007, 20h52
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo