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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé 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
    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 confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    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 :resolu: (en bas)

  3. #3
    Membre confirmé 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
    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
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    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

  5. #5
    Membre confirmé 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
    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
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    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.

  7. #7
    Membre confirmé 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
    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 confirmé 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
    Par défaut
    Voici, si besoin est, l'ensemble de mon code, à l'adresse suivante :

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

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    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.

+ 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