variables globales et lex/yacc

variables globales et lex/yacc - C - Programmation

Marsh Posté le 03-01-2004 à 17:15:22    

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
Reply

Marsh Posté le 03-01-2004 à 17:15:22   

Reply

Marsh Posté le 03-01-2004 à 17:16:44    

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;

Reply

Marsh Posté le 03-01-2004 à 17:22:07    

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

Reply

Marsh Posté le 03-01-2004 à 17:23:17    

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

Reply

Marsh Posté le 03-01-2004 à 17:28:52    

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 :)

Reply

Marsh Posté le 03-01-2004 à 17:29:07    

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

Reply

Marsh Posté le 03-01-2004 à 17:30:14    

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
Reply

Marsh Posté le 03-01-2004 à 17:31:08    

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)

Reply

Marsh Posté le 03-01-2004 à 17:41:32    

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

Reply

Marsh Posté le 03-01-2004 à 17:46:03    

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
Reply

Marsh Posté le 03-01-2004 à 17:46:03   

Reply

Marsh Posté le 04-01-2004 à 12:18:10    

up

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed