IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Problème allocation structure


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Par défaut Problème allocation structure
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    typedef struct Employe
    {
    	char date[10];
    	char nom[30];
    	int num;	
    }Employe;
     
    typedef struct Entreprise
    {
    	char nom[30];
    	struct Employe tabemp[30];
    	struct Entreprise *suivant;
    }Entreprise;
    Fonction ajout entreprise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    void ajouterEnTete( Entreprise ** pListe, char *n, Employe tab[30] )
     
    {
    	Entreprise *ancienPremier ;
    	Entreprise *nouvelEntreprise ;	
    	int i;
     
    	nouvelEntreprise = (Entreprise *)malloc( sizeof( Entreprise ) ) ;	
    	if( nouvelEntreprise == NULL ) {
    		printf( "erreur d'allocation, arrêt du programme \n" ) ;
    		exit(-1) ;
    	}
     
    	strcpy(nouvelEntreprise->nom, n ) ;	
    	for(i=0;i<3;i++){
    		nouvelEntreprise->tabemp[i].num = tab[i].num;
    		strcpy(nouvelEntreprise->tabemp[i].nom,tab[i].nom);
    		strcpy(nouvelEntreprise->tabemp[i].date,tab[i].date);
    	}
    	nouvelEntreprise->suivant = NULL ;		
     
    	if( *pListe == NULL ){	
    		nouvelEntreprise->suivant = NULL ; 
    	}
    	else {
    		ancienPremier = *pListe ;	
    		nouvelEntreprise->suivant = ancienPremier ;	
    	}
    	*pListe = nouvelEntreprise;
    }
    procedure saisir entreprise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    void saisirEntreprise(char *n, Employe tab[30] )
     
    {
    	int i,numemp;
    	char nomemp[30],dateemp[10];
    	printf( "saisir un nom : \n" );
    	scanf( "%s", n) ;
    	for(i=0;i<3;i++) {
    		printf("rentrez un nom,une date d'inscription(JJ/MM/AAAA) et un numero");
    		scanf("%s %s %d", nomemp,dateemp,&numemp);
    		strcpy(tab[i].nom,nomemp);
    		strcpy(tab[i].date,dateemp);
    		tab[i].num=numemp;
    	}
    }
    procedure afficher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    void afficherListe( Entreprise *liste )
    //--------------------------------------
    // affichage de tous les éléments de la liste
    {
    	int i,num;
    	char nom[30],date[10];
    	if( liste == NULL ) {
    		printf( "affichage impossible, la liste est vide\n" ) ;
    		return ;
    	}
     
    	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) ;
    	}
    }
    et mon main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void main()
    {
    	Entreprise * maliste = NULL ;
     
    	int choix;
    	char n1[30];
    	Employe tab1[30];
     
    	saisirEntreprise(n1,tab1);
    	ajouterEnQueue(&maliste,n1,tab1);
    	afficherListe(maliste);
     
    }

    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?

  2. #2
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Salut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	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) ;
    	}
    Tu passes au maillon suivant puis tu tentes d'accéder à ses éléments alors qu'il peut être NULL !
    Tu pourrais déplacer cette ligne en fin de ta boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste = liste->suivant ;// passage au maillon suivant
    d'autant plus que tu n'affiches pas le reste des informations du premier élément .

    @++

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    1. déjà du code inutile et faux à la fin de nouvelEntreprise (et au passage Entreprise est féminin, donc ce serait Nouvelle) :


      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      	nouvelEntreprise->suivant = NULL ;		
       
      	if( *pListe != NULL ){	
      		*pListe->suivant = nouvelEntreprise ;	
      	}
      	*pListe = nouvelEntreprise;
    2. Ensuite dans afficher (et en général dans toute fonction ne modifiant pas la liste) c'est une très mauvaise pratique d'utiliser directement le pointeur de la liste, puisque tu le modifies, même si c'est en interne... Et de plus, comme on te l'as fait remarquer, tu incrémentes avant..


      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
       
      void afficherListe( Entreprise *liste )
      //--------------------------------------
      // affichage de tous les éléments de la liste
      {
      	int i,num;
      	char nom[30],date[10];
                   Entreprise *elt ;
       
      	if( liste == NULL ) {
      		printf( "affichage impossible, la liste est vide\n" ) ;
      		return ;
      	}
       
                   elt = liste ; 
      	while(elt != NULL ){
      		printf( "nom = %s\n", elt->nom) ;
      		for(i=0;i<3;i++)
      			strcpy(nom,elt->tabemp[i].nom);
      			strcpy(date,elt->tabemp[i].date);
      			num=elt->tabemp[i].num;
      			printf( "num = %d \tnom = %s \tdate embauche = %s\n", num, nom, date) ;
      		elt = elt->suivant ;// passage au maillon suivant
      	}
      }
    3. Et enfin tu définis ajouterEnTete mais dans ton main tu appelles ajouterEnQueue

Discussions similaires

  1. Problème de structures
    Par Zikas-r dans le forum C
    Réponses: 6
    Dernier message: 27/12/2006, 00h01
  2. Réponses: 16
    Dernier message: 21/08/2006, 14h12
  3. [Structures]Problème sur structures
    Par kendras dans le forum C++
    Réponses: 5
    Dernier message: 07/06/2006, 10h20
  4. problème allocation mémoire
    Par kinta dans le forum C++
    Réponses: 7
    Dernier message: 09/02/2006, 23h22
  5. [OCaml] Problème de structure/parser
    Par marv1 dans le forum Caml
    Réponses: 4
    Dernier message: 09/05/2005, 12h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo