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 :

une erreur avec les pointeur..


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 71
    Points : 46
    Points
    46
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    extern struct nombre *ptrNombre
    /*un entier saisi*/
    ptrNombre->typeNombre=0;
    ptrNombre->valeur=(double)verifBaseInteger(charTmp,bases);
    L'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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..

  2. #2
    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 Re: une erreur avec les pointeur..
    Citation Envoyé par lecyberax
    fichier grammaire.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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) :

  3. #3
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 71
    Points : 46
    Points
    46
    Par défaut 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"

  4. #4
    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 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    un paramètre pointeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void f (struct mystruct *p);
    un élément de structure de type pointeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  5. #5
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 71
    Points : 46
    Points
    46
    Par défaut 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..

  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 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...

  7. #7
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    La deuxième partie du post d'emmanuel peut être résumé ainsi:
    Tu as le droit d'utiliser la structure (le type en fait) même si elle n'est pas déclarée, par contre tu n'as pas le droit de recuperer ses membres.
    Pour pouvoir utiliser ses membres il faut que tu ais inclu sa declaration.

  8. #8
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 71
    Points : 46
    Points
    46
    Par défaut 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

  9. #9
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    C'est quoi ces extension .l et .y?

  10. #10
    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 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  11. #11
    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 MatRem
    C'est quoi ces extension .l et .y?
    lex et yacc

  12. #12
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 71
    Points : 46
    Points
    46
    Par défaut les extension l e y
    je suis boss actuellent sur la realisation d'un interpreteur de commande sous linux. et j'utilise bison et flex.
    l'extension y c'est le fichier bison et l'extension l c'est le fichier flex(lex).
    mais la majeur partie du developpement se fait en C ANSI.

  13. #13
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    oki... je ne connais que de nom ces deux logiciels.

Discussions similaires

  1. Erreur de compilation avec les pointeurs
    Par alexisleprogrammeur dans le forum Débuter
    Réponses: 7
    Dernier message: 11/06/2013, 08h42
  2. erreur avec les pointeurs (je sais pas d'où ça vient)
    Par EpiTouille dans le forum Débuter
    Réponses: 15
    Dernier message: 01/01/2012, 16h48
  3. [PDO] Création d'une classe contenant du PDO -> Erreur avec les 'fetch'
    Par Cedrinho dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 09/06/2010, 08h53
  4. [TTreeView] Problème avec les pointeurs d'objet
    Par BlackWood dans le forum Composants VCL
    Réponses: 2
    Dernier message: 02/07/2004, 14h31
  5. Erreur avec les ADO
    Par megane dans le forum Bases de données
    Réponses: 7
    Dernier message: 08/03/2004, 21h37

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