Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1701 connectés 

  FORUM HardWare.fr
  Programmation
  C

  variables globales et lex/yacc

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

variables globales et lex/yacc

n°601496
black_lord
Truth speaks from peacefulness
Posté le 03-01-2004 à 17:15:22  profilanswer
 

bonjour à tous,
 
je suis en train d'écrire un compilateur et je rencontre un problème :
 
j'ai mes fonctions persos dans le fichier mes_fonctions.c et il a son .h associé que voici :

Code :
  1. #ifndef __FONCTIONS_H__
  2. #define __FONCTIONS_H__
  3. /* une entree dans la table des symboles */
  4. typedef struct tabl_symb_entree {
  5. char *nom;
  6. int *valeur;
  7. double *valeur2;
  8. /*
  9. Ce champ sert à la vérification des types
  10. 1: int
  11. 2: real
  12. 3: bool
  13. */
  14. int type;
  15. } entree;
  16. /* La table des symboles :) */
  17. entree table_symboles[512];
  18. /* Le nombre d'entrees dans la table */
  19. int nb_entrees=0;
  20. /* Prototypes de fonction */
  21. void traite_declaration(char *declaration);
  22. void install_tbl_symb(char *var, int type);
  23. #endif


 
je fais un include de ce fichier dans mon fichier lex et dans mon fichier yacc pour pouvoir utiliser les fonctions globales ( et les variables aussi)
 
mais mon compilo renvoie ça :
gcc -g compil.tab.c lex.yy.c mes_fonctions.o -lfl -o mop
/tmp/ccXMZqFZ.o: In function `yylex':
/home/nico/projets/ma_compil/lex.yy.c:587: multiple definition of `nb_entrees'
/tmp/ccqXccBw.o:/usr/share/bison/bison.simple:405: first defined here
mes_fonctions.o: In function `traite_declaration':
/home/nico/projets/ma_compil/mes_fonctions.c:6: multiple definition of `nb_entrees'
/tmp/ccqXccBw.o:/usr/share/bison/bison.simple:405: first defined here
collect2: ld returned 1 exit status
 
:'(  avec le #ifndef il devrait pas y avoir de pb non ??
 
je sèche là...


Message édité par black_lord le 03-01-2004 à 17:15:56
mood
Publicité
Posté le 03-01-2004 à 17:15:22  profilanswer
 

n°601500
chrisbk
-
Posté le 03-01-2004 à 17:16:44  profilanswer
 

heuh, ben, le mieux c'est de ne pas definir des vars globales comme ca.
 
methode :  
a la place de
 
int roger;  
 
tu mets
 
extern int roger;
 
et dans un .c (un seul, de ton choix) tu fous
int roger = 0;

n°601511
black_lord
Truth speaks from peacefulness
Posté le 03-01-2004 à 17:22:07  profilanswer
 

marche pas :( il me dit :  
undefined reference to les_vars_en_extern
 
à chacune des lignes auquelles je les utilise
 
mes_focntions.h

Code :
  1. #ifndef __FONCTIONS_H__
  2. #define __FONCTIONS_H__
  3. /* une entree dans la table des symboles */
  4. typedef struct tabl_symb_entree {
  5. char *nom;
  6. int *valeur;
  7. double *valeur2;
  8. /*
  9. Ce champ sert à la vérification des types
  10. 1: int
  11. 2: real
  12. 3: bool
  13. */
  14. int type;
  15. } entree;
  16. /* La table des symboles :) */
  17. extern entree table_symboles[512];
  18. /* Le nombre d'entrees dans la table */
  19. extern int nb_entrees;
  20. /* Prototypes de fonction */
  21. void traite_declaration(char *declaration);
  22. void install_tbl_symb(char *var, int type);
  23. #endif


 
le nb_entrees est initialisé dans le main déclaré dans le .y

n°601514
chrisbk
-
Posté le 03-01-2004 à 17:23:17  profilanswer
 

>>le nb_entrees est initialisé dans le main déclaré dans le .y
 
heuh tu me fais peur, la tu l'as bien mis en global au moins ?

n°601521
black_lord
Truth speaks from peacefulness
Posté le 03-01-2004 à 17:28:52  profilanswer
 

il est en extern dans mes_fonctions.h,
compil.y sort compil.tab.c qui contient le nb_entrees=0 donc ça devrait aller non ??
 
tu veux dire quoi par global ?? là je suis plus
Faut pas avoir peur, c'est que de l'informatique :)

n°601523
Taz
bisounours-codeur
Posté le 03-01-2004 à 17:29:07  profilanswer
 

#ifndef __FONCTIONS_H__  
 
 
déjà tu crois que y a combien de programmeurs au monde qui ont un jour appelé un truc "fonction" ? :pfff:

n°601525
chrisbk
-
Posté le 03-01-2004 à 17:30:14  profilanswer
 

ben une variable globale quoi ?
 
genre t'as fait :
 
1)

Code :
  1. void main()
  2. {
  3. int nb_entrees = 0;
  4. ..
  5. }


 
ou

Code :
  1. int nb_entrees = 0;
  2. void main()
  3. {
  4. ...
  5. }


 
(sachant que c la 2 la bonne)


Message édité par chrisbk le 03-01-2004 à 17:30:25
n°601527
black_lord
Truth speaks from peacefulness
Posté le 03-01-2004 à 17:31:08  profilanswer
 

correct :) c'ets modifié.
 
le makefile au cas où
 

Code :
  1. CC=gcc
  2. LIBS=-lfl
  3. FILES=compil.tab.c lex.yy.c mes_fonctions.o
  4. CC_OPTS=-g
  5. TARGET=mop
  6. $(TARGET):
  7. mrproper:
  8. @rm -f *.o *~ $(TARGET) $(FILES) compil.output compil.tab.h
  9. clean:
  10. @rm -f *.o $(FILES) $(TARGET)
  11. coffee:
  12. @echo "Et pourquoi pas les tartines ??"
  13. mes_fonctions.o: mes_fonctions.h mes_fonctions.c
  14. $(CC) $(CC_OPTS) -c mes_fonctions.c
  15. lex.yy.c: compil.lex
  16. lex compil.lex
  17. compil.tab.c: compil.y
  18. bison -d -v compil.y
  19. $(TARGET): $(FILES)
  20. $(CC) $(CC_OPTS) $(FILES) $(LIBS) -o $(TARGET)

n°601538
Taz
bisounours-codeur
Posté le 03-01-2004 à 17:41:32  profilanswer
 

int main
 
lis le manuel de make (les .PHONY ça te dit quelque chose ?
 
use www.scons.org luke

n°601543
black_lord
Truth speaks from peacefulness
Posté le 03-01-2004 à 17:46:03  profilanswer
 

Citation :

int main

?
tu veux le main ? il est plus que basique.

Code :
  1. int main(void)
  2. {
  3. nb_entrees=0;
  4. yyparse();
  5. }


 
les .PHONY ça me dit rien, je n'ai qu'une connaissance plus que basique de make.
 
- edit : top de la balle :) Merci :jap: -
 
je jette un oeil à la doc et à scons
 
- edit : scons à l'air un peu trop "puissant" pour ce que je fais. Ce n'est qu'un petit compilo fait pour un projet pendant mes études. En plus ça va me perturber le prof ça ;) Par contre ça va dans les liens utiles au cas où un jour j'aurais un truc important à faire. Thanks -


Message édité par black_lord le 03-01-2004 à 17:59:39
mood
Publicité
Posté le 03-01-2004 à 17:46:03  profilanswer
 

n°601838
black_lord
Truth speaks from peacefulness
Posté le 04-01-2004 à 12:18:10  profilanswer
 

up


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  variables globales et lex/yacc

 

Sujets relatifs
Lecture d'un fichier Texte et affectation dans variables kshsauvegarder des variables au format ascii sous scilab???
Comment affichier les variables d'environnement asp ?[Java]Declarer des variables de maniere dynamique?
question bete sur les variables globalesChamps vide et comparaison de variables
J'en peux plus !!! If, else, variables, includes... tout se melange!!!Variables de session (le retour)
Variables incrementees 
Plus de sujets relatifs à : variables globales et lex/yacc


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR