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 :

Problème avec les piles


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti

    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 8
    Par défaut Problème avec les piles
    Bonjour svp j'ai problème sur les pile, en fait j'ai écrit la fonction empiler, dépiler ...
    mais le problème quand j’exécute le programme il m'affiche juste "LA PILE EST VIDE" aidé moi svp

    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
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
     
     
    #include<stdio.h>
    #include<stdlib.h>
     
    typedef enum {
     
     true, false
     
    } bool;
     
    typedef struct pileElement {
     
     int value;
     
    struct pileElement *suivant;
    } pileElement , *pile ;
     
    //------------------CREATION D'UNE PILE-------------------
     
    pile creerPile(void)
    {
       return NULL;
    }
     
    //-----------------TESTE SI UNE PILE EST VIDE-------------
     
    bool estVide(pile pl)
    {
    	if (pl == NULL)
     
    	return true;
     
    	return false;
    }
     
    //----------------EMPILER--------------------------------
     
    pile empiler(pile pl, int x)
    {
      pileElement *nouveau;
     nouveau = (pileElement*)malloc(sizeof(struct pileElement));
     
       nouveau->value = x;
     
       nouveau->suivant = pl;
     
     
    }
     
    //-----------------DEPILER------------------------------
     
    int  depiler(pile pl)
    {
    	pile *nouveau;
     
    	if(pl == NULL)
    	{
     		puts("LA PILE EST VIDE\n");
    		return;
    	}
     
      pl = pl->suivant;
      free(pl);
     
     
    }
     
    //---------------AFFICHAGE D'UNE PILE-------------------
     
    void afficherPile(pile pl)
    {
     
    	if(pl == NULL)
    	{
    		puts("LA PILE EST VIDE\n");
     
    	}
     
      while(pl != NULL)
       {
     
         printf(" [%d]\n", pl->value);
    	pl = pl->suivant;
     }
    }
     
    //---------------------LA FONCTION MAIN------------------
     
    int main(void)
    {
     
      pile maPile;
     
      maPile = creerPile();
      maPile = empiler(maPile , 14);
      maPile = empiler(maPile , 125);
      maPile = empiler(maPile , 45);
     
      afficherPile(maPile);
     
    }

  2. #2
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Tu ne retournes pas (ni même ne modifies !) ta pile dans empiler. Tu l'aurais vu si tu avais prêté attention aux warnings levés par le compilateur. Un code aussi simple c'est zéro warnings tolérés, compile avec -Wall -Wextra et même -Werror tant qu'à faire.

    La fonction dépiler n'est pas non plus fonctionnelle en l'état.

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    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 599
    Par défaut
    Bonjour,

    Attention à la définition de bool. En C 'faux' est associé au 0, il faut préférer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef enum {
     false = 0, true
    } bool;
    Pour le bug, Matt t'as fourni les deux endroits où il manque quelque chose.

  4. #4
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Ouuuh.. bien vu ça ! Si jamais il mixe bool et int y'a moyen d'y perdre un certain temps.

    Un avantage de plus pour :

  5. #5
    Membre averti

    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 8
    Par défaut
    Oui Merci beacoup Matt, la fonction depiler fonctionne bien, mais le problème elle me renvoie la pile saufs le dernier element ajouté
    je n'arrive pas trouvé l'erreur
    Merci beaucoup pour ton aide !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
     
    pile empiler(pile pl, int x)
    {
      pileElement *nouveau;
     nouveau = (pileElement*)malloc(sizeof(struct pileElement));
     
       nouveau->value = x;
     
       nouveau->suivant = pl;
     
     
    }

  6. #6
    Membre averti

    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 8
    Par défaut
    j'ai revu ma fonction depiler elle compile mais elle me renvoie rien l'ors de l'excution !!!!!!!!!
    donne moi un peux d'idée stp
    et encre Merci pour ton aide
    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
     
    pile  depiler(pile pl, int x)
    {
    	pileElement *nouveau;
     
     
    	if(pl == NULL)
    	{
     		puts("LA PILE EST VIDE\n");
    		return;
    	}
     
      nouveau = pl->suivant;
      free(pl);
     
     return nouveau;
    }

  7. #7
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Citation Envoyé par diallo thierno Voir le message
    Oui Merci beacoup Matt, la fonction depiler fonctionne bien, mais le problème elle me renvoie la pile saufs le dernier element ajouté
    C'est le but de dépiler, non ? Ta dernière implémentation semble correcte mais à quoi sert donc le paramètre x ?

    Quant à empiler, il n'y a aucun changement par rapport à la version précédente.

  8. #8
    Membre averti

    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 8
    Par défaut Problème sur les piles
    Bonjours!!!!!
    Je m'y connais pas trop en programmation j'apprend sur les piles representé sous forme d'une tableau
    j'ai ecrit des foncions qui compile mais a l'excusion il me renvoi un message "ERREUR DE SEGMENTATION "
    je ne comprend pas trop c'est que cela vuex dire et aussi je revue mon programme ligne par ligne, ile me semble
    qu'il est bon
    AIDEZ MOI SVP
    Merci....
    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
     
     
    #include<stdio.h>
    #include<stdlib.h>
    #define nmax 100
     
    typedef enum{
    true, false
    }bool;
     
     
     
    typedef struct pileElement{
     
    int sommet;
    int tab[nmax];
    int taillePile;
    }pileElement, *pile; 
     
    //-------------INITIALISATION------------------
    void initialise(pile pl)
    {
     
      pl->sommet = 0; 
    }
    //-------TEST SI UNE PILE EST VIDE-------------
    bool estVide(pile pl)
    {  
       if(pl->sommet == 0)
     
         return true;
     
      else  
         return false;
     
    }
    //-----------TAILLE DE LA PILE----------------
    int taille(pile pl)
    {
      return pl->sommet;
    }
    //---------------SOMMET------------------------
    int sommetPile(pile pl)
    { 
      if(pl->sommet == 0)
      {
        puts("LA PILE EST VIDE");
        return;
      }
     
    return (pl->tab[pl->sommet]);
     
    }
    //----------EMPILER----------------------------
    int empiler(pile pl, int x)
    {
     
      if(pl->taillePile = nmax)
       {
        puts("LA PILE EST PLEINE");
        return;
        }
      pl->sommet = pl->sommet + 1;
      pl->tab[pl->sommet] = x;
     
     
     
    }
    //------------Depiler-----------------------
    int depiler(pile pl)
    {
       if(pl->sommet == 0)
       {
        puts("la pile est vide");
        return;
       }
      pl->sommet = pl->sommet - 1;
      return (pl->tab[pl->sommet]);
     
    }
    //-----------------Afficher------------------
    void afficherPile(pile pl)
    {
     
       int i;
       for(i = pl->sommet - 1; i >= 0; i--)
       {
          printf("%d |", pl->tab[i]);
       }
    }

  9. #9
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    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 599
    Par défaut
    Bonjour,

    Il y a deux champs, sommet et taillePile qui sont fortement liés (par moment on utilise un, puis l'autre), supprimer un des deux. En réalité sommet vaut toujours (taillePile-1). Pile vide si taillePile==0, Pile pleine si taillePile==nmax cela permettra de mieux voir les erreurs d'indices, qui existent
    * Ligne 64 : indice trop haut
    * Ligne 51 : indice trop haut

    Lignes 7 8 et 9 : Définition originale du bool, déjà vue sur le site. Qui propage cette ignominie? Cette définition qui semble marcher est génératrice de bugs.
    Par exemple, essaye ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool estVide(pile pl)
    {  
         return (pl->sommet == 0); // fait l'inverse avec ce 'type bool'!!
    }
    À la place utiliser #include <stdbool.h> s'il existe, ou bien le définir correctement avec un false à 0, exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef enum{
    false = 0, true
    }bool;
    La fonction sommetPile() ne devrait pas compiler!
    Tous les return d'une fonction doivent retourner un élément du type de la fonction! Ici la fonction retourne soit une valeur, soit une indication d'erreur.

  10. #10
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Citation Envoyé par dalfab Voir le message
    Lignes 7 8 et 9 : Définition originale du bool, déjà vue sur le site. Qui propage cette ignominie? Cette définition qui semble marcher est génératrice de bugs.
    Il s'agit du même sujet.

  11. #11
    Membre averti

    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 8
    Par défaut
    Merci
    je revus le code, mais je comprend pas quand tu dit indice trop haut, tu peux me donner un peut de detaille stp
    en plus toujours c'est le meme message je reçois "erreur de segmentation (core dump)" en plus je ne comprend ce que ce message veux dire par là.
    Merci pour ton aide
    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
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
     
    #include<stdio.h>
    #include<stdlib.h>
    //#include<stdbool.h>
    #define nmax 100
     
    typedef enum{
    false = 0, true
    }bool;
     
     
     
    typedef struct pileElement{
     
    int sommet;
    int tab[nmax];
    }pileElement, *pile; 
     
     
    void initialise(pile pl)
    {
     
      pl->sommet = 0; 
    }
    //-------TEST SI UNE PILE EST--------------
    bool estVide(pile pl)
    {  
       return (pl->sommet == 0);
     
     
    }
     
    bool estPleine(pile pl)
    {
      return pl->sommet == nmax;
    }
    //-----------TAILLE DE LA PILE----------------
    int taille(pile pl)
    {
      return pl->sommet;
    }
    //---------------SOMMET------------------------
    int sommetPile(pile pl)
    { 
      if(pl->sommet == 0)
      {
        puts("LA PILE EST VIDE");
        return;
      }
     
    return pl->sommet;
     
    }
    //----------EMPILER----------------------------
    int empiler(pile pl, int x)
    {
     
      if(pl->sommet == nmax)
       {
        puts("LA PILE EST PLEINE");
        return;
        }
      pl->sommet = pl->sommet + 1;
      pl->tab[pl->sommet] = x;
     
     
     
    }
     
     
     
    //------------Depiler-----------------------
    int depiler(pile pl)
    {
       if(pl->sommet == 0)
       {
        puts("la pile est vide");
        return;
       }
      pl->sommet = pl->sommet - 1;
      return (pl->tab[pl->sommet]);
     
    }
    //-----------------Afficher------------------
    void afficherPile(pile pl)
    {
     
       int i;
       for(i = pl->sommet - 1; i >= 0; i--)
       {
          printf("%d |", pl->tab[i]);
       }
    } 
     
     
    main(void)
    {
       pile maPile;
      estVide(maPile);
      estPleine(maPile); 
      printf("le sommet de la pile est %d : \n", sommetPile(maPile)); 
      empiler(maPile, 40);
      empiler(maPile, 50);
       afficherPile(maPile);
     
     
    }

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

Discussions similaires

  1. probléme avec les piles
    Par dev_2007 dans le forum Débuter
    Réponses: 12
    Dernier message: 16/11/2008, 23h13
  2. Problème avec les piles
    Par ouchemhou dans le forum Débuter
    Réponses: 1
    Dernier message: 13/05/2008, 23h05
  3. Problème avec les apostrophes
    Par misterbillyboy dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/07/2003, 16h39
  4. Problème avec les fichiers .JPG
    Par cprogil dans le forum Langage
    Réponses: 5
    Dernier message: 10/06/2003, 15h44
  5. []Problème avec les formulaires Outlook
    Par Invité dans le forum Outlook
    Réponses: 6
    Dernier message: 05/12/2002, 09h59

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