probleme allocation structure

probleme allocation structure - C - Programmation

Marsh Posté le 31-05-2008 à 20:56:26    

Bonjour,
Je crois que j'ai un probleme d'allocation car j'ai cette erreur : Violation d'accès lors de la lecture de l'emplacement ...
 
voila mes deux structures

Code :
  1. typedef struct Employe
  2. {
  3. char date[10];
  4. char nom[30];
  5. int num;
  6. }Employe;
  7. typedef struct Entreprise
  8. {
  9. char nom[30];
  10. struct Employe tabemp[30];
  11. struct Entreprise *suivant;
  12. }Entreprise;


 
Fonction ajout entreprise

Code :
  1. void ajouterEnTete( Entreprise ** pListe, char *n, Employe tab[30] )
  2. {
  3. Entreprise *ancienPremier ;
  4. Entreprise *nouvelEntreprise ;
  5. int i;
  6. nouvelEntreprise = (Entreprise *)malloc( sizeof( Entreprise ) ) ;
  7. if( nouvelEntreprise == NULL ) {
  8.  printf( "erreur d'allocation, arrêt du programme \n" ) ;
  9.  exit(-1) ;
  10. }
  11. strcpy(nouvelEntreprise->nom, n ) ;
  12. for(i=0;i<3;i++){
  13.  nouvelEntreprise->tabemp[i].num = tab[i].num;
  14.  strcpy(nouvelEntreprise->tabemp[i].nom,tab[i].nom);
  15.  strcpy(nouvelEntreprise->tabemp[i].date,tab[i].date);
  16. }
  17. nouvelEntreprise->suivant = NULL ;
  18. if( *pListe == NULL ){
  19.  nouvelEntreprise->suivant = NULL ;
  20. }
  21. else {
  22.  ancienPremier = *pListe ;
  23.  nouvelEntreprise->suivant = ancienPremier ;
  24. }
  25. *pListe = nouvelEntreprise;
  26. }


 
procedure saisir entreprise

Code :
  1. void saisirEntreprise(char *n, Employe tab[30] )
  2. {
  3. int i,numemp;
  4. char nomemp[30],dateemp[10];
  5. printf( "saisir un nom : \n" );
  6. scanf( "%s", n) ;
  7. for(i=0;i<3;i++) {
  8.  printf("rentrez un nom,une date d'inscription(JJ/MM/AAAA) et un numero" );
  9.  scanf("%s %s %d", nomemp,dateemp,&numemp);
  10.  strcpy(tab[i].nom,nomemp);
  11.  strcpy(tab[i].date,dateemp);
  12.  tab[i].num=numemp;
  13. }
  14. }


 
procedure afficher

Code :
  1. void afficherListe( Entreprise *liste )
  2. //--------------------------------------
  3. // affichage de tous les éléments de la liste
  4. {
  5. int i,num;
  6. char nom[30],date[10];
  7. if( liste == NULL ) {
  8.  printf( "affichage impossible, la liste est vide\n" ) ;
  9.  return ;
  10. }
  11. while(liste != NULL ){
  12.  printf( "nom = %s\n", liste->nom) ;
  13.  liste = liste->suivant ;// passage au maillon suivant
  14.  for(i=0;i<3;i++)
  15.   strcpy(nom,liste->tabemp[i].nom);
  16.   strcpy(date,liste->tabemp[i].date);
  17.   num=liste->tabemp[i].num;
  18.   printf( "num = %d \tnom = %s \tdate embauche = %s\n", num, nom, date) ;
  19. }
  20. }


 
et mon main

Code :
  1. void main()
  2. {
  3. Entreprise * maliste = NULL ;
  4. int choix;
  5. char n1[30];
  6. Employe tab1[30];
  7. saisirEntreprise(n1,tab1);
  8. ajouterEnQueue(&maliste,n1,tab1);
  9. afficherListe(maliste);
  10.    
  11. }


 
 
Mon erreur est renvoyée lors de l'execution de la procedure afficherliste au moment où je veux afficher les noms, num et date des employés.
Pourriez vous m'aider svp?

Reply

Marsh Posté le 31-05-2008 à 20:56:26   

Reply

Marsh Posté le 31-05-2008 à 21:04:11    

je sais pas si c'est une faute de frappe mais il manque un { dans la ligne 16 de afficherliste


---------------
„Ich kann, weil ich will, was ich muss.“ I. Kant
Reply

Marsh Posté le 31-05-2008 à 21:58:08    

c'est exact ! je l'ai corrigé mais ca me mets toujours la même erreur

Reply

Marsh Posté le 31-05-2008 à 23:02:18    

while(liste != NULL ){
 printf( "nom = %s\n", liste->nom) ;
  liste = liste->suivant ;// passage au maillon suivant
 for(i=0;i<3;i++)
  strcpy(nom,liste->tabemp[i].nom);
  strcpy(date,liste->tabemp[i].date);
  num=liste->tabemp[i].num;
  printf( "num = %d \tnom = %s \tdate embauche = %s\n", num, nom, date) ;
}
 
Si liste->suivant est NULL avant la ligne en rouge, tu as comme un pb pour tes strcpy, puisque  liste->tabemp[i] n'a plus grand sens. La place de la ligne en rouge ne serait elle pas apres la boucle for?
 
De plus, ca serait plus efficace par la suite d'écrire

for(i=0;i<3;i++)  printf( "num = %d \tnom = %s \tdate embauche = %s\n",  
                                 liste->tabemp[i].num,  
                                 liste->tabemp[i].nom,  
                                 liste->tabemp[i].date);


 
A+,


Message édité par gilou le 31-05-2008 à 23:09:34

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed