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 :

Impossible de neutraliser l'erreur


Sujet :

C

  1. #1
    Membre habitué Avatar de _kal_
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 156
    Points
    156
    Par défaut Impossible de neutraliser l'erreur
    Bonjour à tous,

    Dans le cadre d'un projet scolaire, je dois réaliser un évaluateur d'expression arithmétiques infixe. La méthode est articulé autour de l'utilisation de liste/arbre.

    Lorsque j'essai de compiler mon programme, j'ai une longue liste d'erreur, commencant par ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    kal@tony ~/work/Expressions_arithmethiques $ make
    gcc -g -W -Wall -std=c99 -c main.c
    gcc -g -W -Wall -std=c99 -c liste.c
    In file included from Tval.h:6,
                     from liste.c:4:
    liste.h:9: erreur: erreur de syntaxe avant « Tval »
    liste.h:9: attention : pas de point virgule à la fin de la structure ou de l'union
    liste.h:11: erreur: erreur de syntaxe avant un élément lexical « } »
    liste.h:11: attention : dans la déclaration de « Un_element », utilisation de « int » par défaut pour le type
    liste.h:11: attention : la définition de données n'a pas de type ni de classe de stockage
    liste.h:17: erreur: erreur de syntaxe avant « val »
    liste.h:29: erreur: erreur de syntaxe avant « Tval »
    ...
    Voici le code de liste.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
     
    #ifndef LISTE_H
    #define LISTE_H
     
    #include "Tval.h"
     
    typedef struct _un_element * P_un_element;
    typedef struct _un_element
    {
        Tval elem_val;
        P_un_element suiv;
    } Un_element;
     
    #define LR elem_val.SR
    #define LO elem_val.SO
    #define LE elem_val.SE
    ...
    Tval.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
     
    #ifndef TVAL_H
    #define TVAL_H
     
    #include "rationnel.h"
    #include "noeud.h"
    #include "liste.h"
     
    typedef enum _type_val{OPER, RAT, EXP} Type_val;
     
    typedef struct _Tval {
        Type_val type;
        union _valeur_telt {
            Operateur op;
            Rationnel rat;
            P_un_element expr;
        } valeur;
    } Tval;
    #define SR valeur.rat
    #define SO valeur.op
    #define SE valeur.expr
    ...
    Je ne vois vraiment pas d'ou vient l'erreur, je n'ai oublié aucun ";". Merci de m'éclairer si vous avez une idée

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Cet ensemble de lignes me parait étrange :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct _un_element * P_un_element;
    typedef struct _un_element
    {
        Tval elem_val;
        P_un_element suiv;
    } Un_element, * P_un_element;
    tu définies deux fois P_un_element
    de plus, tu es bien sûr d'utiliser un compilateur C et pas un compilateur C++ ?
    l'utilisation de struct est un peu différente dans les deux langages
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  3. #3
    Membre habitué Avatar de _kal_
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 156
    Points
    156
    Par défaut
    Citation Envoyé par Swoög
    Cet ensemble de lignes me parait étrange :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct _un_element * P_un_element;
    typedef struct _un_element
    {
        Tval elem_val;
        P_un_element suiv;
    } Un_element, * P_un_element;
    tu définies deux fois P_un_element
    de plus, tu es bien sûr d'utiliser un compilateur C et pas un compilateur C++ ?
    l'utilisation de struct est un peu différente dans les deux langages
    Effectivement, je faisait une boule declaration du type P_un_element. En fait, j'avais voulu tester les deux méthodes de déclaration, mais j'ai oublié d'en supprimé une au passage

    Bref, ceci est corrigé et ne résoud pas le problème.

    J'utilise bien un compilo C (GCC). Voici mon Makefile :

    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
     
    CC=gcc
    CFLAGS=-g -W -Wall -std=c99
    EXEC=main
     
    all: $(EXEC)
     
    $(EXEC): main.o rationnel.o noeud.o liste.o utile.o Tval.o
            $(CC) $(CFLAGS) main.o rationnel.o noeud.o liste.o utile.o -o $(EXEC)
     
    main.o: main.c rationnel.h noeud.h liste.h utile.h
            $(CC) $(CFLAGS) -c main.c
     
    liste.o: liste.c liste.h noeud.h utile.h Tval.h
            $(CC) $(CFLAGS) -c liste.c
     
    utile.o: utile.c rationnel.h utile.h
            $(CC) $(CFLAGS) -c utile.c
     
    rationnel.o: rationnel.c rationnel.h
            $(CC) $(CFLAGS) -c rationnel.c
     
    noeud.o: noeud.c rationnel.h noeud.h
            $(CC) $(CFLAGS) -c noeud.c
     
    Tval.o: Tval.c Tval.h rationnel.h noeud.h liste.h
            $(CC) $(CFLAGS) -c Tval.c
     
    clean:
            rm -f *.o $(EXEC)

  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
    Citation Envoyé par _kal_
    Je ne vois vraiment pas d'ou vient l'erreur, je n'ai oublié aucun ";". Merci de m'éclairer si vous avez une idée
    Ton code est incomplet et ne permet pas de compiler. On se sait comment les entêtes sont utilisés.

    Il y a des références croisées. C'est autorisé, mais uniquement avec des pointeurs de type de structures incomplètes. Evidemment, les données ne sont pas accessibles directement et il faut écrire des fonctions 'accesseur'. C'est le principe des TAD (ADT).

    http://emmanuel-delahaye.developpez.com/tad.htm
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre habitué Avatar de _kal_
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 156
    Points
    156
    Par défaut
    Comment ça incomplet ?

    Il marchait tres bien avant que j'ajoute les fichiers Tval.* et liste.* (pour tester mon arbre).

    Peut etre veux tu dire que tu as besoin de tout mon code pour voir le problème ?

  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 _kal_
    Comment ça incomplet ?
    A l'évidence, il manque des bouts...
    • #ifdef sans #endif
    • headers manquants
    • structures inconnues
    Peut etre veux tu dire que tu as besoin de tout mon code pour voir le problème ?
    Pas forcémént, mais au moins vérifié que ce que tu postes à une chance d'être compilable et n'ajoute pas des erreurs à tes vrais problèmes.
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre habitué Avatar de _kal_
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 156
    Points
    156
    Par défaut
    Ok j'ai saisi

    Le problème venait du fait que Tval.h dependait de liste.h, lui même dependant de Tval.h.

    Bref, il y a quand meme un probleme avec le cahier des charges que l'on m'impose. Mon code doit contenir ceci :

    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 enum _type_val{OPER, RAT, EXP} Type_val;
     
    typedef struct _Tval {
        Type_val type;
        union _valeur_telt {
            Operateur op;
            Rationnel rat;
            P_un_element expr;
        } valeur;
    } Tval;
    #define SR valeur.rat
    #define SO valeur.op
    #define SE valeur.expr
    Or, voici la définition de P_un_element :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef struct _un_element * P_un_element;
    typedef struct _un_element
    {
        Tval elem_val;
        P_un_element suiv;
    } Un_element;
    Donc, pour résumer:

    P_un_element depend d'un objet de type Tval. Tval dépend d'un objet de type P_un_element.
    C'est possible?

  8. #8
    Membre habitué Avatar de _kal_
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 156
    Points
    156
    Par défaut
    Voici, si besoin est, l'ensemble de mon code, à l'adresse suivante :

    http://kalhfr.free.fr/Divers/Jussieu...rithmethiques/

  9. #9
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 89
    Points : 91
    Points
    91
    Par défaut
    il faut que tu mettes les 2 typedef dans un .h
    par ex. dans liste.h

  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
    Citation Envoyé par _kal_
    P_un_element depend d'un objet de type Tval. Tval dépend d'un objet de type P_un_element.
    C'est possible?
    Oui, mais il faut 2 headers. Un public :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    /* un_element.h */
    typedef struct un_element * P_un_element;
    a inclure dans le header tval.h et un privé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    /* un_element_private.h */
    #include "un_element.h"
    #include "tval.h"
    struct un_element
    {
        Tval elem_val;
        P_un_element suiv;
    };
    Ce dernier est inclus dans le code qui utilise les implémente les fonctions qui utilisent les elements de struct un_element.
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Membre habitué Avatar de _kal_
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 156
    Points
    156
    Par défaut
    Merci beaucoup, ça marche

  12. #12
    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 _kal_
    Merci beaucoup, ça marche
    Au fait, tu n'es pas 'implémenteur', donc il ne faut pas mettre de '_' devant les identificateurs. C'est réservé.

    http://emmanuel-delahaye.developpez....htm#id_reserve
    Pas de Wi-Fi à la maison : CPL

  13. #13
    Membre habitué Avatar de _kal_
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 156
    Points
    156
    Par défaut
    Oui, je l'avais déjà lu quelque part il me semble. Cependant, ces fonctions me sont imposé par mon prof donc je fait avec. Bien entendu, je n'utiliserai pas de "_" devant mes identificateurs pour mes projets persos

    Trés bon site , nice job

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

Discussions similaires

  1. impossible de trouver l'erreur dans cette requete
    Par laurent.w dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/01/2007, 10h38
  2. impossible de trouver l'erreur dans cette requete
    Par laurent.w dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 05/01/2007, 15h57
  3. Réponses: 2
    Dernier message: 31/10/2006, 15h15
  4. [Configuration] besoin d'aides impossible de corriger les erreurs :(:((:
    Par moonia dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 11
    Dernier message: 27/03/2006, 10h36
  5. Impossible d'attraper une erreur
    Par jagboys dans le forum C++Builder
    Réponses: 2
    Dernier message: 16/06/2005, 00h15

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