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 :

Problème pour conserver une valeur dans ma liste chainée


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 119
    Points : 55
    Points
    55
    Par défaut Problème pour conserver une valeur dans ma liste chainée
    Salut, je développe un analyseur lexical pour mon cours de compilation, et j'ai un problème...

    Pour mon analyseur, j'utilise lex et une liste chaînée pour conserver les tokens, et le problème c'est que la valeur du token est modifée par lex !

    Voici une partie du code dans mon main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // j'ajoute le premier élément de la liste chainée avant de boucler sur yylex()
    table *tete = NULL;	// table est la structure pour ma liste chaînée
    ajoute(&tete, "", "");
    while(eof == 0)
    {
    	// ici la valeur du dernier token est correcte
    	printf("1 -> %s\n", tete->value);
    	yylex();
    }
    yylex() va reconnaître les expressions réguilières que je lui donne et exécuter le code correspondant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [expression_reguliere]	printf("2 -> %s\n", tete->value); ajoute(&teteTable, yytext); return;

    Et si je prend comme exemple le code suivant : int main (...)
    Alors j'aurais à l'affichage :
    1 -> int
    2 -> int main

    Pour ce qui concerne la méthode ajoute(), voilà le code (je me suis inspiré du tutoriel sur les listes chaînées de developpez.com) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void ajoute(table **t, char *val)
    {
    	table *element = malloc(sizeof(table));
    	// Si l'allocation a échouée
    	if(!element)	exit(1);
    	if(*t == NULL)	element->id = 0;
    	else			element->id = (*t)->id + 1;
    	element->value = val;
     
    	element->precedent = *t;
    	// Le pointeur pointe sur le dernier élément
    	*t = element;
    }
    Je pense que le problème vient de là : element->value = val; car val pointe vers yytext qui va être modifié à la boucle suivante... J'ai essayé de remplacer cette ligne par un strcpy mais j'ai du mal m'y prendre car alors tous les éléments de la liste chaînée étaient remplacés par le token en cours (et donc à la fin du fichier, j'avais une liste avec uniquement le dernier token...)


    Quelqu'un a une idée ?


    Merci d'avance !!

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 678
    Points : 30 965
    Points
    30 965
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par zarbiman Voir le message
    Je pense que le problème vient de là : element->value = val; car val pointe vers yytext qui va être modifié à la boucle suivante...
    Tout à fait exact. Tu es dans le bug du shadow copy car tu ne copies que le pointeur et non le pointé. Un peu comme ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main()
    {
        char *home;
        char *path;
        home=getenv("HOME");
        path=getenv("PATH");
        printf("%s - %s\n", home, path);   // Affiche 2 fois le path
    }
    Citation Envoyé par zarbiman Voir le message
    J'ai essayé de remplacer cette ligne par un strcpy mais j'ai du mal m'y prendre car alors tous les éléments de la liste chaînée étaient remplacés par le token en cours (et donc à la fin du fichier, j'avais une liste avec uniquement le dernier token...)
    Bizarre. Tu as mal dû t'y prendre car c'est la solution. Passer par une fonction qui copie le pointé comme strcpy() ou memcpy(). Mais je ne connais pas du tout le mécanisme yylex()
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 119
    Points : 55
    Points
    55
    Par défaut
    Ok merci de ta confirmation !
    Au passage, est-ce que tu pourrais m'aider pour les fonctions strcpy et memcpy ? Je ne suis pas encore très à l'aise avec les pointeurs et j'ai du mal avec ces fonctions malgré les documentations...

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 678
    Points : 30 965
    Points
    30 965
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par zarbiman Voir le message
    Ok merci de ta confirmation !
    Au passage, est-ce que tu pourrais m'aider pour les fonctions strcpy et memcpy ? Je ne suis pas encore très à l'aise avec les pointeurs et j'ai du mal avec ces fonctions malgré les documentations...
    N'importe quel connaisseur t'aidera très volontiers pour strcpy() et/ou memcpy(). Mais en ce qui concerne les pointeurs, c'est un truc qu'on "comprend" par soi-même. Mais il y a une discussion assez enrichissante à ce propos ici http://www.developpez.net/forums/sho...d.php?t=436475
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 119
    Points : 55
    Points
    55
    Par défaut
    Je vais consulter ça asap !
    Au passage j'ai résolu le problème en me basant sur cette page : http://www.opengroup.org/onlinepubs/...ns/strcpy.html

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

Discussions similaires

  1. Problème pour affecter une valeur dans une JSP
    Par chady dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 12/03/2015, 00h16
  2. Problème pour lire une valeur dans une cell
    Par heiriquent dans le forum MATLAB
    Réponses: 4
    Dernier message: 28/07/2013, 23h26
  3. Problème pour définir une valeur dans la base des registres
    Par hellspawn_ludo dans le forum Dreamshield
    Réponses: 2
    Dernier message: 30/09/2007, 03h03
  4. problème pour récupérer une valeur dans ma bd (débutante)
    Par auryn111 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 26/08/2005, 17h49
  5. Conserver une valeur dans un champs
    Par zakfa dans le forum IHM
    Réponses: 5
    Dernier message: 04/10/2004, 08h48

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