Lang c

Résolu/Fermé
alicia85 Messages postés 68 Date d'inscription lundi 19 mai 2008 Statut Membre Dernière intervention 20 août 2009 - 22 juin 2008 à 13:21
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 - 25 juin 2008 à 11:40
Bonjour,comment aller vous j ai un pb sur la verification de la syntaxe d une chaine de caratere j utilise les piles mais mon programme plante voici les procedures pr gerer la pile est ce que c est bon ?
j ai un pb au niveau de depiler et pilevide

8 réponses

alicia85 Messages postés 68 Date d'inscription lundi 19 mai 2008 Statut Membre Dernière intervention 20 août 2009
22 juin 2008 à 13:25
voici le code
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef union enreig{
char c;
int valeur;
}tab;
typedef struct noeud{
tab enreig;
struct neoud *suiv;
}pile;

void creepile(pile**p){
*p=NULL;
}

tab sommet(pile*p){
return(p->enreig);
}

int pilevide(pile *p){
return(p==NULL);
}
int taille_pile(pile*p){
pile *l=p;
int i=0;
while((l!=NULL)&&(++i))
l=l->suiv;
return(i);
}

int empiler(pile**p,const tab t){
{pile*l;
l=(pile*)malloc(sizeof(pile));
if(l!=NULL){
// l->enreig=(tab*)malloc(sizeof(tab));
// if (l->nom!=NULL){
l->enreig=t;
l->suiv=*p;
*p=l;
}
else{
free(l);
l=NULL;
}

return(l!=NULL);
}

void depiler(pile**p){
pile*l;
l=*p;
*p=*p->suiv;
free(l);
}
0
Sri Lumpa Messages postés 177 Date d'inscription mercredi 14 novembre 2007 Statut Membre Dernière intervention 1 juin 2010 69
22 juin 2008 à 13:35
Quels sont tes problèmes exactement ? Pourrais-tu être un peu plus précise ?
0
alicia85 Messages postés 68 Date d'inscription lundi 19 mai 2008 Statut Membre Dernière intervention 20 août 2009
22 juin 2008 à 13:47
j ai les pb dans depiler au niveau des lignes l=*p; et
*p=*p->suiv; le compilateur marque une erreurs a ce niveau je ne sais prquoi et aussi dans la fonction pilevide au niveau de la ligne pile *l=p; merci d avance
0
Sri Lumpa Messages postés 177 Date d'inscription mercredi 14 novembre 2007 Statut Membre Dernière intervention 1 juin 2010 69
22 juin 2008 à 17:28
Dans la fonction depiler, j'ai trouvé ton erreur : quand tu fais *p = *p->suiv, tu dois mettre des parenthèses : *p = (*p)->suiv;. Sans ça, il interprète ta ligne comme ça en fait : *p = *(p->suiv); et en effet, dans ce cas là, p n'est pas une structure mais un pointeur de pointeur sur ta structure. Je n'ai pas d'autres erreurs de compilation.

Juste un conseil, dans ta fonction empiler il vaut mieux éviter le else {free(l) ; l = NULL}. Si on arrive là, c'est que justement l vaut déjà null et n'a pas été initialisé. Si tu fais un free() dessus, tu feras un free(NULL) et ça peut être assez mauvais.
0
merci beaucoup pour tout mais j ai un pb avec mon code lorsque je l execute le fichier executable disparait apres avoir entrer le s données bien qu'ayant getch() ou getchar a la fin du main .que faire ? merci d'avance
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Sri Lumpa Messages postés 177 Date d'inscription mercredi 14 novembre 2007 Statut Membre Dernière intervention 1 juin 2010 69
25 juin 2008 à 07:19
Que veux-tu dire par "le fichier executable disparait" ? Il s'arrete ?
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
25 juin 2008 à 09:29
je pense plutot que tu dois faire p=p->suiv , ca deplace le pointeur. dans l autre cas, si ca marche ca copie l objet complet.
pour ton getchar qui bloc pas, il faut vider le buffer d entrée: flush.
je me rapelle plus de la syntaxe, peut etre es ce flush(stdin) ...
0
Sri Lumpa Messages postés 177 Date d'inscription mercredi 14 novembre 2007 Statut Membre Dernière intervention 1 juin 2010 69
25 juin 2008 à 11:27
Justement, il vaut mieux déplacer juste le pointeur plutôt que l'objet complet quand tu traites une pile...
Remplace ton getchar() par un scanf("%s", NULL), ça attendra que l'utilisateur tape "entrée" pour continuer.
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
25 juin 2008 à 11:31
p c est le pointeur
*p c est l objet, la structure ....
donc il vaut æieu faire p=p->suiv . ceci dit le probleme nes tpas la actuelement ;)
0
Sri Lumpa Messages postés 177 Date d'inscription mercredi 14 novembre 2007 Statut Membre Dernière intervention 1 juin 2010 69
25 juin 2008 à 11:38
Non, ici p est un pointeur sur le pointeur de la pile ;) (depiler (pile **p)) et donc *p et le pointeur sur la pile. Mais tu as raison, c'est pas le problème pour l'instant ;)
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193 > Sri Lumpa Messages postés 177 Date d'inscription mercredi 14 novembre 2007 Statut Membre Dernière intervention 1 juin 2010
25 juin 2008 à 11:40
j avou avoir repondu sans vraiment regarder le code en entier ;) ema culpa
0