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 pointeur sur structure


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Enseignant
    Inscrit en
    Avril 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2007
    Messages : 14
    Points : 20
    Points
    20
    Par défaut problème pointeur sur structure
    Bonjour tout le monde

    J'ai un problème de pointeur au sein d'une structure et je ne comprend pas l'erreur, un peu d'aide serait la bienvenue...
    Merci

    mon .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef struct Case *Case;
    mon .c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct Case{
    	int RangCol;			
    	int NumLigne;			
    	Case CaseSuivante;		
    	void *Contenu;			
    };
    l
    enfin mon main avec l'erreur: error: dereferencing pointer to incomplete type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Case c;
    /* appel d une fonction allouant la case c */
    /*erreur au moment de recuperer le contenu de ces deux champs */
    printf("Affichage de la case:\n");
    	printf("Case(%d,%d)",c->NumLigne,c->RangCol);
    J utilise gcc comme compilo

  2. #2
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    lis le cours ou les tuto sur les structures et comment accèder aux champs..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  3. #3
    Membre à l'essai
    Profil pro
    Enseignant
    Inscrit en
    Avril 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2007
    Messages : 14
    Points : 20
    Points
    20
    Par défaut
    J'ai regardé mais ma structure Case étant une structure Case* je ne comprend pas pourquoi je n'y ai pas accès alors que je le fais de la même manière dans une autre fonction et qu'aucune erreur n'est signalée

  4. #4
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    d'abord ce serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef struct PtrCase{
    	int RangCol;			
    	int NumLigne;			
    	Case CaseSuivante;		
    	void *Contenu;			
    } Case ;
    ensuite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    Case c;
    /* appel d une fonction allouant la case c */
    /*erreur au moment de recuperer le contenu de ces deux champs */
    printf("Affichage de la case:\n");
    	printf("Case(%d,%d)",c.NumLigne,c.RangCol);
    et sinon si tu passes dans une fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void MaFonction ( Case *c )
    {
    printf("Affichage de la case:\n");
    	printf("Case(%d,%d)",c->NumLigne,c->RangCol);
    }
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  5. #5
    Membre à l'essai
    Profil pro
    Enseignant
    Inscrit en
    Avril 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2007
    Messages : 14
    Points : 20
    Points
    20
    Par défaut
    J'ai modifié ma structure comme suit, elle me sert a construire une liste chainée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct ptrCase{
    	int RangCol;			
    	int NumLigne;			
    	Case *CaseSuivante;		
    	void *Contenu;			
    }Case;
    J'utilise la fonction suivante pour l'allocation mémoire, aucun problème de compilation ni d'éxécution
    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
     
    Case* CaseAllouer(int lig,int col, void *formule)
    {
    	Case *c,*tmp;
    	tmp->Contenu=formule;
    	tmp->RangCol=col;
    	tmp->NumLigne=lig;
    	tmp->CaseSuivante=NULL;
     
    	if ((c=malloc(sizeof(tmp)))==NULL)
    	{
    		fprintf(stderr,"Erreur de la creation de case\n");
    		return NULL;
    	}
    	else
    	{
    		*c=*tmp; 
    		return c;
    	}
    }
    Voici le code complet de mon main que je viens de modifier, je suis debutant sur le forum et ai du mal expliqué mon probleme, l'erreur est toujours au même endroit lorsque je cherche à accéder au contenu
    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
     
    int main()
    {
    	Case *c;
    	int coord[2],i;
    	int contenu;
    	printf("Test de l allocation d une case\n");
    	printf("Entrez les coordonnees de la case:   ");
    	for(i=0;i<2;i++) scanf("%d",coord+i);
    	printf("\nEntrez l entier que vous voulez inserer comme contenu");
    	scanf("%d",&contenu);
    	printf("c parti pour caseallouer\n");
    	c=CaseAllouer(coord[0],coord[1],&contenu);
    	printf("\nFin de la creation de la case\n");
    	printf("Affichage de la case:\n");
    	printf("Case(%d,%d)",c->NumLigne,c->RangCol);
    	exit(0);
    }
    Lorsque je compile toutes mes fonctions dans un seul et même fichier il n'y a aucun problème, je n'arrive pas à comprendre pourquoi ça na marche pas en compilation séparée

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par lejohn
    Lorsque je compile toutes mes fonctions dans un seul et même fichier il n'y a aucun problème, je n'arrive pas à comprendre pourquoi ça na marche pas en compilation séparée
    Mets tout tes fichiers en pièce jointes. Il doit y avoir un bug dans les headers...
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre à l'essai
    Profil pro
    Enseignant
    Inscrit en
    Avril 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2007
    Messages : 14
    Points : 20
    Points
    20
    Par défaut
    Voila ci joint mes 3 fichiers, la compilation se déroule sans aucun problème sous gcc pour matrice.c et matrice.h, lorsque je compile matrice.o avec test_matrice, il y a erreur dereferencing pointer to incomplete type au niveau du dernier printf, lorsque je cherche à atteindre les champs de ma cellule.
    Fichiers attachés Fichiers attachés

  8. #8
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    bon je crois qu'il faudrait sérieusement que tu révises ton chapitre sur les pointeurs, sur les include, etc...

    il y a pas mal de choses incorrectes, et en plus tu ne tiens pas compte de ce qu'on t'a dit :


    Déjà tes définitions de structures DOIVENT être dans ton .h, pas juste les pointeurs.

    D'autre part, tu confonds les typedef, les pointeurs, et les structures... Regarde ton cours..

    Voici ce que devrait être ton .h :

    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
    32
    33
    34
    
    #ifndef _MATRICE_H
    #define _MATRICE_H
    
    #include <stdlib.h>
    
    typedef struct PCase {
    	int RangCol;			/* numero de la colonne ou est la case */
    	int NumLigne;			/* numero de la ligne ou est la case */
    	struct PCase *CaseSuivante;		/* pointeur sur la case NON VIDE suivante, NULL si derniere ou seule case de la ligne */
    	void *Contenu;			/* champ ou sera rentree la formule  */
    } Case ;
    
    typedef struct PLigne {
    	int NbrCases;				/*  nbr de cases constituant au moment le chainage */
    	int NumLigne;				/* numero de la ligne */
    	struct PLigne *LigneSuivante;		/* pointeur sur la ligne suivante, NULL si pas d autres lignes */
    	Case *PemiereCase;			/* pointeur sur la premiere case NON VIDE de la ligne */
    } Ligne;	
    
    typedef struct PMatrice {
    	int NbrLignesMax;	    /*  nbr de lignes maximum que poura contenir le tableau  */
    	int NbrColMax;		    /*  nbr de colonnes maximum...                                            */
    	Ligne PremiereLigne;    /* Pointeur sur la premiereligne du tableau                        */
    	int NbrLignesEnCours;   /* utile ??? nbr de ligne en cours dans le tableau              */
    } Matrice ;
    
    
    
    
    extern Case *CaseAllouer(int lig,int col, void *formule);
    
    #endif
    Ensuite, comme tu ne tiens pas compte de ce qu'on te dit dans les réponses, voici ce que devrait être ton matrice.c :

    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
    #include "Matrice.h"
    
    
    
    
    /************************* CaseAllouer ************************************* 
    *		# renvoi l'adresse de la case que l on vient de creer, NULL si probleme 
    *		# rang: correspond au rang de la case au sein de la ligne= numero de colonne
    *		# formule: contenu de la case, de type void
    *		# Utilisation d une case temporaire tmp pour allouer la bonne quantite  d espace memoire, probleme du au contenu generique -> on ne connait pas la taille d une formule... 
    */
    Case *CaseAllouer(int lig,int col, void *formule)
    {
    	Case *c=NULL;		
    	if ((c=malloc(sizeof(Case)))==NULL)
    	{
    		fprintf(stderr,"Erreur de la creation de case\n");
    		return NULL;
    	}
    	else
    	{
    	  (*c).Contenu=formule;
    	  (*c).RangCol=col;
    	  (*c).NumLigne=lig;
    	  (*c).CaseSuivante=NULL;
    	  return c;
    	}
    }
    Et enfin, ton test :

    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
    
    #include<stdio.h>
    #include<stdlib.h>
    #include "Matrice.h"
    
    int main()
    {
    	Case *c=NULL;
    	int coord[2],i;
    	int contenu;
    	printf("Test de l allocation d une case\n");
    	printf("Entrez les coordonnees de la case:   ");
    	for(i=0;i<2;i++) scanf("%d",coord+i);
    	printf("\nEntrez l entier que vous voulez inserer comme contenu");
    	scanf("%d",&contenu);
    	printf("c parti pour caseallouer\n");
    	c=CaseAllouer(coord[0],coord[1],&contenu);
    	printf("\nFin de la creation de la case\n");
    	printf("Affichage de la case:\n");
    	printf("Case(%d,%d) contenu:%d",(*c).NumLigne,(*c).RangCol,*((int*)(*c).Contenu));
    	exit(0);
    }

    [EDIT]

    Je ne l'ai pas mentionné avant, mais ce code-là compile sans erreur, et donne les bons résultats ..

    [/EDIT]
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  9. #9
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Si tu procèdes ainsi :
    .h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef struct Case *Case;
    .c : définition Tu masques complètement le contenu de la struct Case au code extérieur au .c .
    Ce peut être voulu, si tu veux rendre opaque le contenu de struct Case aux utilisateurs et les empècher de lire ou de modifier directement les champs de la structure. Dans ce cas, il faut écrire des fonction d'accès pour les champs auxquels l'utilisateur a la permission d'accéder (en lecture ou/et en écriture) dont le prototype sera dans le .h
    Exemple :
    .c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     int GetNumLigne(Case p) {return p->NumLigne);
    .h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int GetNumLigne( Case p);
    permet la lecture mais pas la modification du champ NumLigne.

    Si tu n'as pas besoin d'une telle protection, mets la définition de struct Case dans le .h.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  10. #10
    Membre à l'essai
    Profil pro
    Enseignant
    Inscrit en
    Avril 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2007
    Messages : 14
    Points : 20
    Points
    20
    Par défaut
    Merci Diogène, maintenant je comprends mon erreur...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. pointeur sur structures
    Par Seimaya dans le forum Débuter
    Réponses: 33
    Dernier message: 26/08/2007, 18h13
  2. Réponses: 6
    Dernier message: 07/07/2007, 18h12
  3. pointeur sur structure
    Par julien.63 dans le forum C
    Réponses: 7
    Dernier message: 04/06/2007, 17h50
  4. Réponses: 2
    Dernier message: 21/03/2007, 10h55
  5. [MFC] Problème pointeur sur une classe
    Par mick74 dans le forum MFC
    Réponses: 7
    Dernier message: 14/04/2004, 14h17

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