Piles en C

glee89 Messages postés 31 Statut Membre -  
glee89 Messages postés 31 Statut Membre -
<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

  1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    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
  2. glee89 Messages postés 31 Statut Membre
     
    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
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      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
    2. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
       
      ç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
  3. glee89 Messages postés 31 Statut Membre
     
    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
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      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
    2. glee89 Messages postés 31 Statut Membre
       
      C'est dans l'insertion, après avoir entré les éléments que ça se plante.
      0
    3. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      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
    4. glee89 Messages postés 31 Statut Membre
       
      comment est-ce que je devrais procéder pour le faire par exemple?
      0
    5. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      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
  4. glee89 Messages postés 31 Statut Membre
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. glee89 Messages postés 31 Statut Membre
     
    resolut!!!!!!!

    il fallait seuelment creer un addresse memoire pour les variables "Nom3" et "Matricule".
    Merci à tous ceux qui m'ont aidé.
    0
    1. glee89 Messages postés 31 Statut Membre
       
      printf ("Entrez le matricule de l'eleve: ") ;
      scanf ("%d", &pt_eleve->Matricule) ;
      printf("Entrer son nom: ") ;
      scanf("%s",&pt_eleve->Nom) ;
      0
    2. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      scanf("%s",&pt_eleve->Nom) ;
      Pas de "&" devant pt_eleve (même si ça marche avec).
      0
    3. glee89 Messages postés 31 Statut Membre
       
      mais ça se plante sans!
      0