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 :

Petit problème avec une pile


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2007
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 31
    Par défaut Petit problème avec une pile
    salut les ami
    j'ai un pti problem qui va me rendre fou
    dans ce code simple :
    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
     
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #define N 100
     
     
    typedef struct pile
    {
            char p[N];
            int sommet ;    
    } pile;
    pile k = {0} ;
    char dov[3]= { '{','[' ,'(' } ,df[3]= { '}',']' ,')' };  
     
    //int rech_indice(char c);
    void Empiler(char c);
    //char Depiler();
     
    int main (void)
    {
       char ch[N] , s ;
       int i , valide ;
     
       printf("Saisir une expression :  \n");  
       fgets(ch, sizeof ch, stdin);
       //gets(ch);
       //ch[strlen(ch)] = '\0' ;
     
     
    for( i=0 ; i<strlen(ch)  ; i++ )
    {                        
       if (  ch[i]== '{' || ch[i]== '[' || ch[i]== '('  )
       {
       Empiler( ch[i]  );
       printf("%c",ch[i]); /* j'ai fais le printf pour verifier */
       }
    }
     
    getch();
    return 0;
    }
     
     
    void Empiler(char c)
    {
        if(k.sommet < N)
        { 
        k.sommet++;
        k.p[k.sommet]=c;
        }
        else
        printf("Plie Pleine .");
    }
    mais à l'execution il y a plantation du programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Saisir une expression :
    (a+b[
    ([[[((({([({({([{([({(({((((((((

    y a t-il une faute avec cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (  ch[i]== '{' || ch[i]== '[' || ch[i]== '('  )
    car quand j'ai fais debug le compilateur a indiqué cette ligne .

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 815
    Billets dans le blog
    1
    Par défaut
    Le membre "k.sommet" n'est pas initialisé !!!
    Par ailleurs, vaut mieux remplir "k.p[k.sommet]" avant d'incrémenter "k.sommet" car sinon tu perds l'emplacement "[0]"
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre averti
    Inscrit en
    Septembre 2007
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 31
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Le membre "k.sommet" n'est pas initialisé !!!
    Par ailleurs, vaut mieux remplir "k.p[k.sommet]" avant d'incrémenter "k.sommet" car sinon tu perds l'emplacement "[0]"
    cette indique que tous les champs de la structure sont initialiser
    et le principe de l'empilement on incrémente d'abord et on affecte .

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 815
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par josef24 Voir le message
    et le principe de l'empilement on incrémente d'abord et on affecte .
    Hum... et d'où sors-tu ce beau principe ???
    Avec ton algo quand "k.sommet" sera égal à 99 tu le feras passer à 100 puis t'iras remplir l'élément "[100]" qui est hors tableau !!!

    Citation Envoyé par josef24 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       //ch[strlen(ch)] = '\0' ;
    Ce genre d'instruction aussi j'aime bien. Etant donné que "strlen()" se sert du '\0' pour trouver la longueur de la chaîne (si pas de '\0' pas de strlen() possible) cela signifie que tu cherches à quel endroit se trouve un '\0' pour aller en mettre un à cet endroit. Bon, heureusement que c'est du commentaire...

    Sinon, pour trouver la solution à ton problème, ben pourquoi tu affiches pas aussi "i" quand tu affiches "ch[i]" ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre averti
    Inscrit en
    Septembre 2007
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 31
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Hum... et d'où sors-tu ce beau principe ???
    Avec ton algo quand "k.sommet" sera égal à 99 tu le feras passer à 100 puis t'iras remplir l'élément "[100]" qui est hors tableau !!!
    pour le principe c'est le prof au cours me l'a dit
    pour le k.sommet il ne peut egaler 100 car dans la fonction j'ai fais la condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void Empiler(char c)
    {
        if(k.sommet < N) /* ici */
        { 
        k.sommet++;
        k.p[k.sommet]=c;
        }
        else
        printf("Plie Pleine .");
    }
    et toi tu l'a compilé chez toi ... tous s'est bien passé ???

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 52
    Par défaut
    Si le prof l'a dit, pourquoi pas, mais dans ce cas, il faut que tu initialises ta variable sommet à -1. et tu considéreras que ta pile est vide si sommet=-1.
    Par contre svear a raison et tu vas droit vers un comportement indéterminé ou un crash si tu empiles plus de N valeurs. Ton prof a sûrement du te dire qu'en C un tableau commence a l'indice 0 et donc qu'un tableau de N valeurs est valide de T[0] à T[N-1].

    Donc après avoir initialisé sommet à -1,


    soit tu modifies ton test
    soit tu modifies ton tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct pile
    {
            char p[N+1];
            int sommet ;    
    } pile;

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 815
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par josef24 Voir le message
    pour le principe c'est le prof au cours me l'a dit
    Entre ce que dit le prof et ce que reçoit l'élève...

    Citation Envoyé par josef24 Voir le message
    pour le k.sommet il ne peut egaler 100 car dans la fonction j'ai fais la condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void Empiler(char c)
    {
        if(k.sommet < N) /* ici */
        { 
        k.sommet++;
        k.p[k.sommet]=c;
        }
        else
        printf("Plie Pleine .");
    }
    Ben justement !!! T'as un cerveau alors sers t'en !!! Tu testes puis tu incrémentes puis tu remplis l'élément incrémenté !!!
    Si k.sommet vaut 99 il répondra à la condition "if (k.sommet < N)" donc il passera par l'instruction "k.sommet++" et il atteindra la valeur 100 et t'ira remplir k.p[100]!!!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Petit problème avec une requête SQL en VB6
    Par muzele dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 15/11/2007, 20h51
  2. Petit problème avec une DropDownList
    Par Dohmaker dans le forum VB.NET
    Réponses: 6
    Dernier message: 20/09/2007, 18h19
  3. Petit problème avec une procédure stockée
    Par Poulain dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 18/05/2007, 18h58
  4. Petits problèmes avec une CListCtrl
    Par vanitom dans le forum MFC
    Réponses: 2
    Dernier message: 17/11/2005, 11h45
  5. (Petit ?) problème avec une page contenant du Flash
    Par ologram dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 01/09/2005, 18h45

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