Piles en C

<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. Contributeur
    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. 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!
      1. Contributeur
        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 ^^.
      2. Contributeur
        ça veux dire quoi pour toi "il ne compile pas". Pour moi ça veux dire que le compilateur te jette, donc avec une erreur.
    2. 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
      1. Contributeur
        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,
      2. C'est dans l'insertion, après avoir entré les éléments que ça se plante.
      3. Contributeur
        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 :-).
      4. comment est-ce que je devrais procéder pour le faire par exemple?
      5. Contributeur
        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.
    3. 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.
      1. resolut!!!!!!!

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