Piles en C

Fermé
glee89 Messages postés 21 Date d'inscription mardi 31 juillet 2012 Statut Membre Dernière intervention 19 juin 2013 - 31 juil. 2012 à 22:25
glee89 Messages postés 21 Date d'inscription mardi 31 juillet 2012 Statut Membre Dernière intervention 19 juin 2013 - 4 août 2012 à 14:47
<code>Bonjour,
Ce message s'adresse à tous les seigneurs de la programmation en C, j'ai un très gros problème lorsque je compile mon programme, un problème avec Windows et le compilateur!
Je voudrais, à tous les master de la programmation qui sont connectés actuellement de résoudre ce blême pour moi.


Le programme:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "pile1.h"

char affi_menu() {
printf("/*****************************************************************************\\n") ;
printf("\n * GESTION D'UNE PILE DE PERSONNES *\n") ;
printf("/*****************************************************************************\\n") ;
printf("\n \n") ;
}

int menu () {
printf (" 1 - Insertion dans la pile\n") ;
printf (" 2 - Retrait de la pile\n") ;
printf (" 3 - Listage de la pile\n") ;
printf (" 0 - Fin\n") ;
printf ("\n") ;
printf ("Votre choix ? ") ;
int cod ; scanf ("%d", &cod) ; getchar() ;
printf ("\n") ;
return cod ;
}

void initialisation (Pile*ptr_tas){
ptr_tas->debut = NULL ;
ptr_tas->taille = 0 ;
}

/* empiler (ajouter) un élément dans la pile */
int empiler (Pile * ptr_tas, Etudian*info)
{
Cellule*nouveau_element ;
if ((nouveau_element = (Cellule*) malloc (sizeof (Cellule))) == NULL) return -1 ;
if ((nouveau_element->info = (Etudian*) malloc (50 * sizeof (Etudian)))== NULL) return -1 ;
strcpy (nouveau_element->info->Nom, info->Nom) ;
nouveau_element->info->Matricule = info->Matricule ;
nouveau_element->suiv = ptr_tas->debut ;
ptr_tas->debut = nouveau_element ;
ptr_tas->taille++ ;
}

/* depiler (supprimer un élément de la pile */
int depiler (Pile*ptr_tas){
Cellule*supp_element ;
if (ptr_tas->taille == 0) return -1 ;
supp_element = ptr_tas->debut ;
ptr_tas->debut = ptr_tas->debut->suiv ;
free (supp_element->info) ;
free (supp_element) ;
ptr_tas->taille-- ;
return 0 ;
}

/* affichage de la pile */
void affiche (Pile * ptr_tas){
Cellule*courant ;
int i ;
courant = ptr_tas->debut ;
for(i=0;i<ptr_tas->taille;++i)
{
printf("\t\t%s\n", courant->info) ;
courant = courant->suiv ;
}
}


int main ()
{
int stop = 0 ;
Pile *ptr_tas ;
Etudian *pt_eleve ;
if ((ptr_tas = (Pile *) malloc (sizeof (Pile))) == NULL) return -1 ;
if ((pt_eleve = (Etudian*) malloc (50 * sizeof (Etudian))) == NULL) return -1 ;
initialisation (ptr_tas) ;

while (!stop) { // tantque (nonstop) faire
affi_menu() ;
switch (menu() ) {
case 0 :
system("cls") ;
affi_menu() ;
stop = 1 ;
break ;

case 1:
system("cls") ;
affi_menu() ;
printf ("Entrez le matricule de l'eleve: ") ;
scanf ("%d", pt_eleve->Matricule) ;
printf("Entrer son nom: ") ;
scanf("%s",pt_eleve->Nom) ;
empiler (ptr_tas, pt_eleve) ;
printf ("La pile contient %d elements. \n",ptr_tas->taille) ;
printf("\n +\n") ;
system("pause") ;
system("cls") ;
break ;
case 2:
system("cls") ;
if (ptr_tas->taille==0){
affi_menu() ;
printf("\nRetrait interdit.\n") ;
printf("\nLa pile est vide!\n") ;
}
else{
affi_menu() ;
printf ("\nLe dernier entre (LastInFirstOut) [ %s ] sera supprime",pile_donnee(ptr_tas)) ;
printf ("\nLe dernier entre est supprime\n") ;
depiler (ptr_tas) ; /* suppression de dernier element entre */
printf ("La pile contient %d elements. \n",ptr_tas->taille) ;
}
printf("\n \n") ;
system("pause") ;
system("cls") ;
break ;
case 3:
system("cls") ;
affi_menu() ;
printf("\n****************************** Haut de la PILE *********************************\n") ;
affiche(ptr_tas) ;
printf("______________________________ Bas de la PILE __________________________________\n\n") ;
printf(" \n") ;
printf("\n \n") ;
system("pause") ;
system("cls") ;
break ;
} // fin_switch()
} // fin_tantque
printf(" \n") ;
system("pause") ;
return 0 ;
getch() ;
}







La bibliothèque:

typedef struct Etudiant
{
int*Matricule ;
char*Nom ;
}Etudian ;

typedef struct Pt_sur_Cellule {
Etudian*info ;
struct Pt_sur_Cellule*suiv ;
} Cellule ;

typedef struct ListeRepere{
Cellule*debut ;
int taille ;
} Pile ;


/* initialisation */
void initialisation (Pile*ptr_tas) ;

/* EMPILER*/
int empiler (Pile*ptr_tas, Etudian*info) ;

/* DEPILER*/
int depiler (Pile*ptr_tas) ;

/* Affichage de élément en haut de la pile (LastInFirstOut) */
#define pile_donnee(ptr_tas) ptr_tas->debut->info

/* Affiche la pile */
void affiche (Pile*ptr_tas) ;


5 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
31 juil. 2012 à 22:43
Y'aura pas besoin d'un master en prog pour t'aider sur ce genre de problème ^^.
En revanche, ce qui nous aiderait, ce serait que tu nous précises ton problème. Warning à la compilation ? Erreur ? Quelle ligne ? Etc.
La prochaine fois, n'oublie pas de mettre ton code dans les balises "code" (à droite du bouton "souligné"), sinon ce n'est pas très lisible.
Cdlt,
1
glee89 Messages postés 21 Date d'inscription mardi 31 juillet 2012 Statut Membre Dernière intervention 19 juin 2013
31 juil. 2012 à 23:33
Ok! pour la balise!
Pour le programme, j'aimerai que chaque personne qui le reçoive le compile!
Il n'y a pas d'érreur, c'est seulement qu'il ne compile pas!
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
Modifié par fiddy le 31/07/2012 à 23:40
Soit, ton EDI est mal configuré et dans ce cas, il faudrait que tu nous dises lequel tu utilises. Soit, il y a un message d'erreur ou un warning. Soit il compile et ça plante à l'exécution. Soit tout marche mais je doute que t'aurais fait un message ^^.
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
1 août 2012 à 10:10
ça veux dire quoi pour toi "il ne compile pas". Pour moi ça veux dire que le compilateur te jette, donc avec une erreur.
0
glee89 Messages postés 21 Date d'inscription mardi 31 juillet 2012 Statut Membre Dernière intervention 19 juin 2013
1 août 2012 à 15:43
Je travaille avec dev-Cpp!
Voila le message qu'il affiche:
Pile_dynamic.exe a cessé de fonctionner
Un problème a fait que le programme a cessé de fonctionner correctement. Windows va fermer ce programme et vous indiquer si une solution est disponible.
Fermer le programme
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
1 août 2012 à 19:54
Si tu as "Pile_dynamic.exe" c'est que ton programme a compilé.
Vu le message, il n'y a aucun problème avec la compilation. C'est plutôt à l'exécution...
Je viens de tester, sur ma machine, ça marche.
Ton programme plante tout de suite ? Ou tu as le temps de "jouer" avec ?
Cdlt,
0
glee89 Messages postés 21 Date d'inscription mardi 31 juillet 2012 Statut Membre Dernière intervention 19 juin 2013
1 août 2012 à 23:34
C'est dans l'insertion, après avoir entré les éléments que ça se plante.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
Modifié par fiddy le 1/08/2012 à 23:49
Ah bah voilà, fallait commencer par ça. Ton programme compile très bien, c'est juste qu'il y a des erreurs à l'exécution.
Et effectivement, en regardant ton code, c'est normal.
Tu as alloué "pt_eleve" avec le malloc, mais tu n'as pas alloué le champ nom.
Du coup, ça plante.
Je me suis juste arrêté à la 1ère erreur. J'ai pas lu le reste, il y en a donc peut-être d'autres, qu'on verra au fur et à mesure :-).
0
glee89 Messages postés 21 Date d'inscription mardi 31 juillet 2012 Statut Membre Dernière intervention 19 juin 2013
2 août 2012 à 20:24
comment est-ce que je devrais procéder pour le faire par exemple?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
2 août 2012 à 21:44
Beh, tu fais un malloc comme tu l'as fait pour la structure.
pt_eleve->nom=malloc(...);

Ou alors dans la structure au lieu de mettre char*, tu mets char[TAILLE_MAX]
Pour info : pas besoin de cast devant le malloc(...), il est implicite.
0
glee89 Messages postés 21 Date d'inscription mardi 31 juillet 2012 Statut Membre Dernière intervention 19 juin 2013
2 août 2012 à 20:33
le programme en faite demande de construire une pile d'éléments dans laquelle on peut faire les operations suivantes:
-empiler un élément;
-depiler simplement un élément;
-depiler et supprimer un élément dans la pile;
-rechercher dans la pile;
-afficher les éléments de la pile.
0

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

Posez votre question
glee89 Messages postés 21 Date d'inscription mardi 31 juillet 2012 Statut Membre Dernière intervention 19 juin 2013
4 août 2012 à 11:34
resolut!!!!!!!

il fallait seuelment creer un addresse memoire pour les variables "Nom3" et "Matricule".
Merci à tous ceux qui m'ont aidé.
0
glee89 Messages postés 21 Date d'inscription mardi 31 juillet 2012 Statut Membre Dernière intervention 19 juin 2013
4 août 2012 à 11:35
printf ("Entrez le matricule de l'eleve: ") ;
scanf ("%d", &pt_eleve->Matricule) ;
printf("Entrer son nom: ") ;
scanf("%s",&pt_eleve->Nom) ;
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
4 août 2012 à 12:53
scanf("%s",&pt_eleve->Nom) ;
Pas de "&" devant pt_eleve (même si ça marche avec).
0
glee89 Messages postés 21 Date d'inscription mardi 31 juillet 2012 Statut Membre Dernière intervention 19 juin 2013
4 août 2012 à 14:47
mais ça se plante sans!
0