une erreur avec les pointeur..
salut je boss sur la conception d'un interpreteur qui fait des calculs arithmétique, j'utilise bison et flex sous linux , mais j'utilise aussi du C.
j'ai une probleme avec les pointeur.
je vous donne un extrait de ce qui m'arrive:
j'utilise trois fichier, c'est donc de la programmation modulaire.
dans un fichier que j'ai nommé "Grammaire.c" contient l'ensemble de mes définition de stricture de types etc..
Extrait des fichiers:
-fichier grammaire.c
Code:
1 2 3 4 5 6 7 8 9
| /*declaration de le structure de nombre manipulé */
struct nombre{
int typeNombre; /*le type du nombre [entier|reel]*/
double valeur; /*le valeur du nombre */
}nombre;
/*declaration d'un pointeur de nombre*/
struct nombre *ptrNombre; |
-fichier grammaire.l
Code:
1 2 3 4
| extern struct nombre *ptrNombre
/*un entier saisi*/
ptrNombre->typeNombre=0;
ptrNombre->valeur=(double)verifBaseInteger(charTmp,bases); |
L'erreur:
Code:
1 2 3 4
| Grammaire.l:33: error: dereferencing pointer to incomplete type
Grammaire.l:34: error: dereferencing pointer to incomplete type
Grammaire.l:41: error: dereferencing pointer to incomplete type
Grammaire.l:42: error: dereferencing pointer to incomplete type |
je ne saisi vraiment pas cette erreur ci-dessus.
merci de m'aider..
Re: une erreur avec les pointeur..
Citation:
Envoyé par lecyberax
fichier grammaire.c
Code:
1 2 3 4 5 6 7 8 9 10
|
/*declaration de le structure de snombre manipulé */
struct nombre{
int typeNombre; /*le type du nombre [entier|reel]*/
double valeur; /*le valeur du nombre */
}nombre;
/*declaration d'un pointeur de nombre*/
struct nombre *ptrNombre; |
Code:
1 2 3 4 5 6
|
fichier grammaire.l
extern struct nombre *ptrNombre
/*un entier saisi*/
ptrNombre->typeNombre=0;
ptrNombre->valeur=(double)verifBaseInteger(charTmp,bases); |
Code:
1 2 3 4 5
|
[b]Grammaire.l:33: error: dereferencing pointer to incomplete type
Grammaire.l:34: error: dereferencing pointer to incomplete type
Grammaire.l:41: error: dereferencing pointer to incomplete type
Grammaire.l:42: error: dereferencing pointer to incomplete type[/b] |
je ne saisi vraiment pas cette erreur ci-dessus.
Le problème est que dans grammaire.I, la structure n'est pas définie. Le compilateur dit qu'il ne peut déréférencer un pointeur sur une structure dont il ne connait pas les membres. Ca parait logique, non ?
Si tu tiens à utiliser une variable globale, il faut le faire selon les regles de l'art.
http://emmanuel-delahaye.developpez....s.htm#globales
Donc si on suit ces principes, dans le fichier d'en-tête (header), tu vas placer :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
/* structure */
struct nombre
{
int typeNombre; /* le type du nombre [entier|reel] */
double valeur; /* la valeur du nombre */
};
/* globale */
/* declaration d'un pointeur de nombre */
extern struct nombre *ptrNombre; |
(un peu de cohérence dans la présentation ne peut pas nuire...)
et inclure ce header dans grammaire.c et dans grammaire.l (à la place de extern struct nombre *ptrNombre).
EDIT, Oups, j'avais pas vu la défintion de 'nombre'. Elle doit être séparée, retirée du header et placée dans grammaire.c (par exemple) :
Code:
struct nombre nombre;
les entête sont dans le fichier .c
j'ai dans mon fichier .c la definition de ma structure ; ce qui suit:
struct nombre{
int typeNombre;
double valeur;
}nombre;
et ensuite je fait une declaration sur cette structure
struct nombre *ptrNombre;
et dans le fichier .l j'apelle cette declaration comme suit tout en sachant que dans un autre fichier .y j'ai inclut mon fchier .c, et aussi ce fichier .y est inclut en entête dans le fichier .l
Dans mon fichier .l je declare ceci;
extern struct nombre *ptrNimbre;
alors je me dis qu'il ne dois pas y avoir de problème.
Au fait ca veux dire quoi "dereferencing to incomplete type"
Re: les entête sont dans le fichier .c
Citation:
Envoyé par lecyberax
j'ai dans mon fichier .c la definition de ma structure ; ce qui suit:
BUG! j'avais oublié de sortir 'nombre'. J'ai corrigé mon post précédant.
Code:
Au fait ca veux dire quoi "dereferencing to incomplete type"
Littéralement "[tentative de ]déréférencement d'un type incomplet"
J'ai déjà donné l'explication.
Citation:
Envoyé par -ed-
Le compilateur dit qu'il ne peut déréférencer un pointeur sur une structure dont il ne connait pas les membres
Complément d'information.
En C on a le droit de définir une structure dite 'incomplète'. C'est à dire dont on connait le nom, mais pas les membres.
Avec ça, on a le droit de définir un pointeur
Code:
struct mystruct *p;
un paramètre pointeur :
Code:
void f (struct mystruct *p);
un élément de structure de type pointeur
Code:
1 2 3 4
| struct mystructx
{
struct mystruct *p;
}; |
on peut même définir une structure auto référencée (noeud de liste, d'arbre etc.):
Code:
1 2 3 4
| struct node
{
struct node *p_next;
}; |
C'est donc utile pour définir des interfaces. Mais le jour où il faut accéder aux membres, il faut connaitre le détail de la structure :
Code:
1 2 3 4 5 6
| struct mystruct
{
int a;
char *b;
...
}; |
Un exemple d'utilisation avancée :
http://emmanuel-delahaye.developpez.com/tad.htm
incompréhension dans ton explication
j'arrive vraiment pas à me retrouver dans ton explication..en fait je ne comprends rien de tout ce que tu m'a di..j'aimerais bien que tu soit plus explicite s'il te plait.
concernant les différents fichier et les declaration dont j'ai fait cas..
Re: incompréhension dans ton explication
Citation:
Envoyé par lecyberax
j'arrive vraiment pas à me retrouver dans ton explication..en fait je ne comprends rien de tout ce que tu m'a di..j'aimerais bien que tu soit plus explicite s'il te plait.
concernant les différents fichier et les declaration dont j'ai fait cas..
J'ai détaillé.
Si quelque chose t'échappe, pose des questions précises, parce que quand je vois "je ne comprends rien", je fais un blocage...
plus de details pour faire comprendre...
j'ai en fait 3 fichiers:
grammaire.l
grammaire.y
grammaire.c
dans grammaire.y
j'ai ceci
#include "grammaire.c"
dans grammaire.c
j'ai ma définition de structure,donc ceci
struct nombre{
int typeNombre;
double valeur;
}nombre;
dans grammaire.l
j'ai ceci:
#include "grammaire.tab.c" qui est le resultat de la compilation de mon ficher grammaire.y
alors je me dis que je peux utiliser les définitions de structure qui sont faites dans mon fichier grammaire.c include dans grammaire.y dont le fichier issu de la compilation de ce dernier se trouve inclut dans grammaire.l
dans grammaire.l
je fait un :
extern struct nomnre *ptrNombre;
et ensuite je j'initialise ce pointeur sur ma structure "nombre"
c'est a la suite de ca que j'ai cette erreur:dereferencing to incomplete type.
ce qui veux dure kil n'arrive pas à accéder aux membres de ma structure, ce que je ne comprends pas du tout..
j'espère me faire comprendre mieux et avoir une issue de solution.
merci
Re: plus de details pour faire comprendre...
Citation:
Envoyé par lecyberax
j'espère me faire comprendre mieux et avoir une issue de solution.
Tu crées un fichier "nombre.h" dans lequel tu places
- Des protections contre les inclusion multiples
- La définition de la structure
- La déclaration du pointeur global
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| /* nombre.h */
#ifndef H_NOMBRE
#define H_NOMBRE
struct nombre
{
int typeNombre;
double valeur;
};
extern struct nombre *ptrNombre;
#endif /* guard */ |
Ensuite, tu supprimmes partout (sauf dans "nombres.h", bien sûr) "extern struct nombre *ptrNombre;"
Tu recompiles, et dans chaque fichier où il y a un problème de variable inconnue ou de déréférencement impossible, tu inclus "nombre.h".
Si ça ne fonctionne pas, je ne peux rien faire de plus.