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 :

Programme : Table des symboles


Sujet :

C

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut Programme : Table des symboles
    Salut,
    j'ai cree différentes fonctions qui me permettent d'ajouter ou de rechercher une variable dans la tablr des symboles.

    En testant mon programme,je n'obtiens pas ce que j'espérais avoir à l'affichage du nom et de la valeur du symbole que j'ai ajouté.

    Les fonctions sont du style:
    fonction(x,y)= + * x y 7 nom,nombres de parametres,parametres et l'arbre(expression)

    Les variables:
    nom = 30 nom,valeur(type double)

    Si vous pouviez m'aider à trouver ce qui cloche?

    Merci d'avance


    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    #include <stdio.h>
    #include <float.h>
    #include <string.h>
    #include <stdlib.h>
     
     
    #define MAX 100
     
     
     
    enum Type {Operateur, Constante, Variable};
     
     
    union Info  
    {
      double cte;
      char *nom;
      char op;
    };
     
    struct noeud{
    	enum Type type;
      union Info info;
      struct noeud *gauche;
      struct noeud *droit;
    };
     
    typedef struct noeud Noeud;
    typedef struct noeud * Expression;
     
     
    typedef struct _Symbole{
      int type;
      char *nom;
      double val;
      int nb_parametres;
      char *parametres;
      Expression e;
    } Symbole;
     
    typedef struct _Environnement{
      unsigned taille;
      Symbole tab[MAX];
    } Environnement;
     
     
     
    /* Initialisation de la table d'environnement */
     
    void InitEnvironnement(Environnement *Env)
    {
      Env->tab[0].nom = "MIN";
      Env->tab[0].val = DBL_MIN;
      Env->tab[1].nom = "MAX" ;
      Env->tab[1].val = DBL_MAX;
      Env->taille = 2U;
    }
     
     
     
    /* Recherche la position d'un nom dans la table */
     
    unsigned int RecherchePos(Environnement *Env,const char *nom)
    {
      unsigned pos ;
     
      for(pos = 0U; pos<Env->taille; ++pos)
        if(Env->tab[pos].nom != NULL && (!(strcmp(nom,Env->tab[pos].nom))))
          return pos;
      return MAX;
    }
     
     
     
    /* Recherche si une variable appartient à la table et donne sa valeur 
    si c'est le cas */
     
    int RechercheVariable(Environnement *Env,const char *nom, int *type, 
    double *valeur)
    {
      unsigned pos = RecherchePos(Env,nom);
     
      /* la variable n'a pas ete trouvee */
      if (pos == MAX) return 1;
     
      /* trouvee */
      *type = Env->tab[pos].type;
      *valeur = Env->tab[pos].val;
      return 0;
    }
     
     
     
    /* Recherche si une fonction appartient à la table et donne son nombre 
    de parametres, ses parametres et sa definition si c'est le cas */
     
    int RechercheFonction(Environnement *Env,const char *nom, int *type, 
    int *nb_parametres, char **parametres, Expression *e)
    {
      unsigned pos = RecherchePos(Env,nom);
     
      /* la variable n'a pas ete trouvee */
      if (pos == MAX) return 1;
     
      /* trouvee */
      *type = Env->tab[pos].type;
      *nb_parametres = Env->tab[pos].nb_parametres;
      *parametres = Env->tab[pos].parametres;
      *e = Env->tab[pos].e;
      return 0;
    }
     
     
    /* Ajout d'une variable dans la table des symboles */
     
    int AddVariable(Environnement *Env,const char *nom, int type, double 
    val)
    {
      unsigned pos = RecherchePos(Env,nom);
     
      if(pos == MAX)/* pas trouve */
        pos = Env->taille;
      Env->tab[pos].nom = (char*)malloc(strlen(nom)+1);
     
      if(Env->tab[pos].nom == NULL)
        {
          fprintf(stderr,"erreur allocation\n");
          return 1 ;
        }
     
      strcpy(Env->tab[pos].nom,nom);
      Env->tab[pos].type = type;
      Env->tab[pos].val = val;
      return 0;
    }
     
     
     
    /* Ajout d'une fonction dans la table des symboles */
    int AddFonction(Environnement *Env,const char *nom, int type, int 
    nb_parametres, const char *parametres, Expression e)
    {
      unsigned pos = RecherchePos(Env,nom);
     
      if(pos==MAX)/* pas trouve */
        pos=Env->taille;
      Env->tab[pos].nom = (char*)malloc(strlen(nom)+1);
     
      if(Env->tab[pos].nom == NULL)
        {
          fprintf(stderr,"erreur allocation\n");
          return 1 ;
        }
     
      strcpy(Env->tab[pos].nom,nom);
      Env->tab[pos].type = type;
      Env->tab[pos].nb_parametres = nb_parametres;
     
      Env->tab[pos].parametres = (char*)malloc(strlen(parametres)+1);
     
      if(Env->tab[pos].parametres == NULL)
        {
          fprintf(stderr,"erreur allocation\n");
          return 1 ;
        }
     
      strcpy(Env->tab[pos].parametres,parametres);
      Env->tab[pos].e = e;
      return 0;
    }
     
     
    void SuppEnv(Environnement *Env)
    {
      unsigned pos;
     
      for(pos = 0; pos<Env->taille; pos++)
        free(Env->tab[pos].nom);
    }
     
     
     
    int main(void)
    {
      int i;
      Environnement env;
      InitEnvironnement(&env);
      AddVariable(&env,"test",0,125.58);
      for(i=0;i<env.taille;i++)
        {
          printf("%s = % lf",env.tab[i].nom,env.tab[i].val);
          printf("\n");
        }
      return 0;
    }

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Premièrement et parenthése:

    - C'est un projet de compilation que tu es en train de faire... Sauf si je m'abuse, c'est généralement un exercice compliqué et qui se fait lorsque des bases sont bien en place...

    Or lorque je regarde ton code, il est bien structuré mais il y a des erreurs de logiques assez terrible...

    Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      Env->tab[0].nom = "MIN";
      Env->tab[0].val = DBL_MIN;
      Env->tab[1].nom = "MAX" ;
      Env->tab[1].val = DBL_MAX;
      Env->taille = 2U;
    Le 20 te semble-t-il logique?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      if(pos == MAX)/* pas trouve */
        pos = Env->taille;
    Ne faudrait-il pas incrémenter taille? Et si on sort du tableau parce qu'on a 100 élément dedans?

    Enfin, je ne suis pas trop pour la déclaration:
    Je préfére
    Mais ce dernier point est une question de goût...

    Jc

  3. #3
    Inactif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 72
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par fearyourself
    Premièrement et parenthése:

    - C'est un projet de compilation que tu es en train de faire... Sauf si je m'abuse, c'est généralement un exercice compliqué et qui se fait lorsque des bases sont bien en place...

    Or lorque je regarde ton code, il est bien structuré mais il y a des erreurs de logiques assez terrible...

    Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      Env->tab[0].nom = "MIN";
      Env->tab[0].val = DBL_MIN;
      Env->tab[1].nom = "MAX" ;
      Env->tab[1].val = DBL_MAX;
      Env->taille = 2U;
    Le 20 te semble-t-il logique?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      if(pos == MAX)/* pas trouve */
        pos = Env->taille;
    Ne faudrait-il pas incrémenter taille? Et si on sort du tableau parce qu'on a 100 élément dedans?

    Enfin, je ne suis pas trop pour la déclaration:
    Je préfére
    Mais ce dernier point est une question de goût...

    Jc
    Dans la partie initialisation,je mets la taille à 2 U (unsigned int),je ne vois pas de 20?
    Concernant un éventuel dépassement de capacité,je souhaite d'abord avoir un code "propre" pour ensuite modifié le programme pour utiliser une table de hachage.

    Sinon,est ce que tu vois d'ou viens mon problème?

  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
    Gryzzly
    Man_Und
    Gandalf77

    Euh, tu as combien de pseudos comme ça ? Le vrai nom, c'est quand même plus simple...
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut
    Bonjour,

    j'ai essayé de voir ou se trouvait le problème de mon programme mais je ne vois pas ou est l'erreur.

    Meme en utilisant gdb,je n'ai pas d'erreur.
    Si quelqu'un pouvait m'aider.
    Merci

    (gdb) run
    Starting program: Test
    MIN = 0.000000
    MAX = 1797693134862315708145274237317043567980705675258449965989174
    7680315726078002853876058955863276687817154045895351438246423
    4321326889464182768467546703537516986049910576551282076245490
    0903893289440758685084551339423045832369032229481658085593321
    2334827479782620414472316873817718091929988125040402618412485
    8368.000000

    Program exited normally.

  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: Programme : Table des symboles
    Citation Envoyé par Man_Utd
    j'ai cree différentes fonctions qui me permettent d'ajouter ou de rechercher une variable dans la table des symboles.

    En testant mon programme,je n'obtiens pas ce que j'espérais avoir à l'affichage du nom et de la valeur du symbole que j'ai ajouté.
    <...>
    Il y a un problème de conception.

    Dans la structure 'Symbole', le champ 'nom' est un pointeur sur char. Or plus tard, il est initialisé avec l'adresse d'une chaine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       Env->tab[0].nom = "MIN";
    ce qui rend cette opération :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       strcpy (Env->tab[pos].nom, nom);
    hasardeuse (comportement indéfini), vu qu'un chaine n'est pas modifiable (et même si elle l'était, la taille est-elle suffisante ? Nul ne le sait...)

    Il faudrait soit un tableau de char, soit un pointeur vers un tableau de char d'une taille connue. Bref, il faut écrire du code cohérent.

    Il y a probablement d'autres problèmes, mais ça, déjà, chez moi

    option de gcc :
    ça empêche de compiler.
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut
    Il faudrait soit un tableau de char, soit un pointeur vers un tableau de char d'une taille connue. Bref, il faut écrire du code cohérent
    En utilisant un tableau de char ,j'obtiens ce message avec l'option que tu as donné:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    gcc -Wall -ansi -g -Wwrite-strings Test.c
    Test.c: In function `InitEnvironnement':
    Test.c:51: error: incompatible types in assignment
    Test.c:53: error: incompatible types in assignment

  8. #8
    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 Man_Utd
    Il faudrait soit un tableau de char, soit un pointeur vers un tableau de char d'une taille connue. Bref, il faut écrire du code cohérent
    En utilisant un tableau de char ,j'obtiens ce message avec l'option que tu as donné:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    gcc -Wall -ansi -g -Wwrite-strings Test.c
    Test.c: In function `InitEnvironnement':
    Test.c:51: error: incompatible types in assignment
    Test.c:53: error: incompatible types in assignment
    Ben oui, une copie de chaine se fait avec strcpy(). C'est élémentaire, tu n'as donc pas de cours de C ? Tu programmes au hasard, sans réfléchir à ce que tu fais ?
    Je pense que tu n'as pas les bases nécessaires à la réalisation d'un tel programme. Tu devrais commencer par passer du temps pour apprendre le C...
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut
    Les modifications apportées à la fonction InitEnvironnement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ~$ gcc -Wall -ansi -g -Wwrite-strings Test.c -o Test
    ~$ ./Test
    MIN =  0.000000
    MAX =  1797693134862315708145274237317043567980705675258449965989174
    7680315726078002853876058955863276687817154045895351438246423
    4321326889464182768467546703537516986049910576551282076245490
    0903893289440758685084551339423045832369032229481658085593321
    2334827479782620414472316873817718091929988125040402618412485
    8368.000000
    Toujours pas ce que je souhaite


    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
    void InitEnvironnement(Environnement *Env)
    {
      Env->tab[0].nom = (char*)malloc(strlen("MIN"));
     
      if(Env->tab[0].nom == NULL)
        {
          fprintf(stderr,"erreur allocation\n");
          return ;
        }
      strcpy(Env->tab[0].nom,"MIN");
      Env->tab[0].val = DBL_MIN;
     
      Env->tab[1].nom = (char*)malloc(strlen("MAX"));
     
      if(Env->tab[1].nom == NULL)
        {
          fprintf(stderr,"erreur allocation\n");
          return ;
        }
      strcpy(Env->tab[1].nom,"MAX");
      Env->tab[1].val = DBL_MAX;
     
      Env->taille = 2U;
    }

  10. #10
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    As-tu pris en compte ma remarque précédente?


    [Lors de l'insertion,] Ne faudrait-il pas incrémenter taille?
    PS: La réponse est oui si tu as des doutes...

  11. #11
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut
    Citation Envoyé par fearyourself
    As-tu pris en compte ma remarque précédente?


    [Lors de l'insertion,] Ne faudrait-il pas incrémenter taille?
    PS: La réponse est oui si tu as des doutes...
    Merci à tous ceux qui m'ont apporté leur aide,mon programme fonctionne à présent:
    j'obtiens cet affichage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    MIN =  0.000000
    MAX =  1797693134862315708145274237317043567980705675258449965989174
    7680315726078002853876058955863276687817154045895351438246423
    4321326889464182768467546703537516986049910576551282076245490
    0903893289440758685084551339423045832369032229481658085593321
    2334827479782620414472316873817718091929988125040402618412485
    8368.000000
    test =  125.580000
    test2 =  15788.000000
    PS:est ce que DBL_MIN est bien la plus petite valeur représentable par un double?
    Si c'est le cas,il n'y a pas de valeur négative?

  12. #12
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    PS:est ce que DBL_MIN est bien la plus petite valeur représentable par un double?
    Si c'est le cas,il n'y a pas de valeur négative?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //Il y a peut-être une autre solution...
    MIN =  -DBL_MAX;

  13. #13
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 26
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Bonjour
    Salut tout le monde je viens de rejoindre le site
    alors jai des diffécultés en compilation .. je veux savoir est ce que les commentaire sont représentés dans la table des symboles et comment y representé les fonctios prédefinie
    Merciiii

  14. #14
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 617
    Points : 43 590
    Points
    43 590
    Par défaut
    Bonsoir et bienvenue sur developpez.com

    Tu as répondu à un message datant de 2005. Tu aurais du créer un nouveau post.

    Les commentaires n'apparaissent pas dans le code compilé.

    Qu'entends tu par fonctions prédéfinies ? je présumes qu'il s'agit des fonctions de la libc. La libc est liée à ton code. Les fonctions externes que tu utilises ont une entrée dans la section gérant le code relogeable (dépendant du type d’exécutable Linux ELF PE Windows).
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

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

Discussions similaires

  1. [WD-2010] Tables des Symboles (button icons)
    Par cyrjack dans le forum VBA Word
    Réponses: 1
    Dernier message: 27/04/2012, 22h07
  2. Réponses: 0
    Dernier message: 08/03/2012, 16h41
  3. Intérêt d'une table des symboles dans un traducteur
    Par Chabanus dans le forum Langages de programmation
    Réponses: 1
    Dernier message: 04/01/2011, 09h51
  4. Compilation / table des symboles
    Par j0o0 dans le forum Langages de programmation
    Réponses: 1
    Dernier message: 27/10/2009, 10h42
  5. [NASM] Table des symboles [32BIT] [*NIX]
    Par orfix dans le forum x86 32-bits / 64-bits
    Réponses: 1
    Dernier message: 25/02/2009, 23h13

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