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 :

Modèle de classe - Pile - Fonction retirer


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 10
    Par défaut Modèle de classe - Pile - Fonction retirer
    Bonjour à tous,

    Comme le titre l'indique je travaille sur le template d'une classe de Pile, en logique FIFO (first in first out) et j'ai un problème dans ma fonction Retirer().

    La fonction qui me permet d'empiler a bien été vérifié.

    Voici ma fonction Retirer() :

    Nom : Sans titre3.png
Affichages : 705
Taille : 23,2 Ko

    Lorsque que je l'a teste sur le main grâce à ce code :

    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
    File <int> F1(5);
    cout << "Taille utilisee : " << F1.Tailleutilisee() << endl;
    cout << "Valeurs : " << F1.Empiler(10) << endl;
    cout << "Taille utilisee : " << F1.Tailleutilisee() << endl;
    cout << "Valeurs : " << F1.Empiler(20) << endl;
    cout << "Valeurs : " << F1.Empiler(30) << endl;
    cout << "Valeurs : " << F1.Empiler(45) << endl;
    cout << "Valeurs : " << F1.Empiler(50) << endl;
    cout << "Taille utilisee : " << F1.Tailleutilisee() << endl;
    cout << F1.Retirer() << endl;
    cout << "Taille utilisee : " << F1.Tailleutilisee() << endl;
    cout << F1.Retirer() << endl;
    cout << "Taille utilisee : " << F1.Tailleutilisee() << endl;
    cout << F1.Retirer() << endl;
    cout << "Taille utilisee : " << F1.Tailleutilisee() << endl;
    cout << F1.Retirer() << endl;
    cout << "Taille utilisee : " << F1.Tailleutilisee() << endl;
    cout << F1.Retirer() << endl;
    cout << "Taille utilisee : " << F1.Tailleutilisee() << endl;
    cout << F1.Retirer() << endl << endl << endl;
    Voici le résultat que j'obtiens :

    Nom : Sans titre2.png
Affichages : 470
Taille : 20,7 Ko

    J'ai essayé de comprendre mon erreur qui semble être dans la façon de réécrire la pile après avoir enregistré la valeur que l'on veut sortir mais je n'ai pas trouvé.

    Merci par avance.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Si c'est FIFO, ce n'est pas une Pile, mais une File.
    Alors, est-ce une Pile (LIFO) ou une File (FIFO)?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 10
    Par défaut
    Une file !

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 600
    Par défaut
    Bonjour,

    la boucle effectue une étape de trop.
    for ( i = 0 ; i < TailleUtilisee()-1 ; ++ i )

    Lors de la première itération, on écrit dans l'indice[5] qui est hors table, ce qui écrase une donnée en mémoire...

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 10
    Par défaut
    Bonjour, par rapport à cette réponse, ayant utilisé la fonction empiler pour ajouter 5 valeurs, la variable Tailleutilisee est donc égale à 5, or ma condition de boucle est i strictement inférieure à Tailleutilisee donc 4 boucles dans mon cas. Normalement, c'est bien le nombre de boucle nécessaire à remplacer les données du tableau.

    De plus ayant essayé avec Tailleutilisee()-1, rien n'a changé, lorsque j'utilise ma fonction retirer une première fois il me retourne bien la valeur du premier objet empiler mais lorsque je l'utilise une deuxième fois, il me retourne une valeur aléatoire, ensuite pour les troisième et quatrième fois il retire bien les valeurs du deuxième et troisième objet.

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Tu ne veux vraiment pas nous faciliter la tâche :
    - Tu nous caches la définition de ta classe, et le rôle de tes différentes variables...
    - Tu nous empêches de faire des copier/coller de code en mettant un screenshot plutôt que le code lui même (balise [code] pour qu'il soit bien mis en forme, bouton #)

    Sinon, en plus de la réponse de dalfab (il m'a grillé), je dirais :
    - J'ai des gros doutes sur la gestion de la mémoire dans ta classe, mais on n'en voit pas assez pour être plus précis. C'est peut-être bon si tu as une limite arbitraire sur le nombre d'éléments possibles dans ta queue.
    - En terme de performances, ta queue est catastrophique, puisqu'on retire un élément en O(N). Participer ainsi au réchauffement climatique en plein COP21, c'est de la provocation
    - C'est quoi ce vide() == 1 ? Vide retourne quoi ? Un booléen j'espère...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 10
    Par défaut
    [QUOTE=JolyLoic;8465407]Tu ne veux vraiment pas nous faciliter la tâche :
    - Tu nous caches la définition de ta classe, et le rôle de tes différentes variables...
    - Tu nous empêches de faire des copier/coller de code en mettant un screenshot plutôt que le code lui même (balise [code] pour qu'il soit bien mis en forme, bouton #)

    Désolé je suis inscrit que depuis peu sur le site et ayant mis le code une première fois tout était collé sans les espaces donc j'ai opté pour des screenshots.

    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
    template <class T> class File
    {
     
    public:
                File(int);          //Constructeur définit à la suite du .h
                ~File();
                int Tailleutilisee();
                T Empiler(T);
                T Retirer();
                bool pleine();
                bool vide();
     
    private:
                int taille;             //Nombres d'éléments maximal de la Pile
                T* adresse;         //Zone mémoire de la Pile
                T* ptrSommet;
    };
    Voici la définition de ma fonction File

  8. #8
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 10
    Par défaut
    - En terme de performances, ta queue est catastrophique, puisqu'on retire un élément en O(N). Participer ainsi au réchauffement climatique en plein COP21, c'est de la provocation

    Je n'ai pas du tout compris ce point sinon ^^

    En tout cas, merci pour vos réponses dans tous les cas.

  9. #9
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 10
    Par défaut
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    template <class T> File<T>::File(int n)
    {
        taille = n;
        adresse = new T[taille];
        ptrSommet = NULL;
    }
     
    template <class T> File<T>::~File()
    {
        delete [] adresse;
    }
     
    template <class T>int File<T>::Tailleutilisee()
    {
        if (ptrSommet==NULL)
            return 0;
        else
            return (ptrSommet-adresse);
    }
     
     
     
    template <class T>T File<T>::Empiler(T Element)
    {
        bool a;
        a = pleine();
        if (a==1)
            cout << "La pile est deja pleine" << endl;
        else
        {
            if(ptrSommet==NULL)
            {
                adresse[0]=Element;
                ptrSommet = adresse+1;
                //cout << "Adresse [0] " << adresse[0] << endl;
     
            }
            else
            {
                ptrSommet++;
                *ptrSommet = Element;
                //cout << "Valeur ptrSommet :  " << *ptrSommet << endl;
            }
        return Element;
        }
    }
     
    template <class T>T File<T>::Retirer()
    {
        if (vide()==1)
            cout << "La pile est deja vide" << endl;
        else
        {
            T b;
            if(Tailleutilisee()==1)
            {
                b = adresse[0];
                ptrSommet = NULL;
            }
            else
            {
                b = adresse[0];
                int i;
                for (i=0;i<(Tailleutilisee()-1);i++)
                {
                    //cout << adresse[i+1] << endl;
                    adresse[i] = adresse[i+1];
                    //cout << adresse[i] << endl;
                }
                ptrSommet--;
            }
            return b;
        }
    }
     
    template <class T>bool File<T>:: pleine()
    {
        if (Tailleutilisee()==taille)
            return true;
        else
            return false;
    }
     
    template <class T>bool File<T>:: vide()
    {
        if (Tailleutilisee()==0)
            return true;
        else
            return false;
    }
    Et voici le reste des fonctions utilisées.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Classes ou fonctions ?
    Par alceste dans le forum C++
    Réponses: 6
    Dernier message: 27/06/2006, 12h44
  2. problème classe et fonction
    Par zmatz dans le forum C++
    Réponses: 14
    Dernier message: 19/10/2005, 21h46
  3. Classe, pile, pointeurs et casse-tête!
    Par zazaraignée dans le forum Langage
    Réponses: 6
    Dernier message: 26/09/2005, 16h57
  4. Classes - Sub/Fonction vs Property
    Par j_bolduc dans le forum ASP
    Réponses: 6
    Dernier message: 24/08/2005, 19h19

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