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

GTK+ avec C & C++ Discussion :

Les listes chaînées


Sujet :

GTK+ avec C & C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 40
    Points : 28
    Points
    28
    Par défaut Les listes chaînées
    Bonjour à tous ! (désolé d'innonder le forum de questions qui j'en suis sûr sont simple à résoudre)

    Je dispose d'un fichier contenant des adresses de musique. Le fichier se présente comme cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    D:\Ma musique\Audioslave - Be Yourself.mp3
    D:\Ma musique\Come-Together.mp3
    D:\Ma musique\John Legend - P.D.A..mp3
    Pour les récupérer, je procède ainsi (j'espère que c'est ainsi qu'il faille le faire):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while(fgets(chaine_fichier, 100, musique) != NULL)
        {
            Widget->PlayListe = g_slist_append(Widget->PlayListe, (char*)chaine_fichier);
        }
        fclose(musique);
    Mais le problème est quand j'affiche le contenue de la liste, j'obtiens 3 fois le même chemin à savoir celui de la dernière ligne du fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    D:\Ma musique\John Legend - P.D.A..mp3
    D:\Ma musique\John Legend - P.D.A..mp3
    D:\Ma musique\John Legend - P.D.A..mp3
    Je pense que le problème viens de ma compréhension de l'utilisation des listes chainées alors si vous pouviez m'aider.

    Merci d'avance.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Nope, c'est surtout un pb avec les pointeurs ton bug. chaine_fichier, ça représente un emplacement mémoire précis, et ce que fait ta boucle, c'est stocker la valeur du fichier courant dans cet emplacement mémoire, stocker l'emplacement mémoire dans la liste, et passer à l'élément suivant.
    Mais tu utilises et stockes toujours la même zone mémoire à chaque passage dans ta boucle, donc au final, ta liste contient N fois un pointeur sur le mêem emplacemnet mémoire, donc il est normal que tu obtiennes toujours la même valeur quand tu l'affiches.
    Widget->PlayListe = g_slist_append(Widget->PlayListe, g_strdup ((char*)chaine_fichier));
    devrait faire ce que tu veux. Il faut ajouter un g_slist_foreach (Widget->PlayListe, (GFunc)g_free, NULL); quand ut veux libérer la mémoire utilisée par ta liste par contre (en plus du g_slist_free (Widget->PlayListe))

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Un grand merci à toi et pour ton aide, tu m'as permis de démistifier un grand souci que j'avais avec les listes chainées, mais aussi avec les tableaux de pointeurs.

    En gros, si j'ai bien compris la fonction g_strdup créer une copie dynamique de chaine_fichier ?

    Voilà, sujet résolu.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Citation Envoyé par AureK Voir le message
    En gros, si j'ai bien compris la fonction g_strdup créer une copie dynamique de chaine_fichier ?
    Exactement, en gros ça fait un malloc (strlen (str)); suivi d'une copie de la chaîne de départ dans la zone tout juste allouée.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Pour ne pas créer un nouveau topic et surtout car mon problème est tjrs en rapport avec les listes chaînées, je poste ici. Comme dis dans les autres postes, je stocke mais musique(du moins le chemin) dans ma liste. Mais après avoir passé en long et en large les fonctions de suppression d'élément(s) d'une liste j'en viens à vous.

    Pourrait-on m'aider à comprendre comment vider entièrement une liste ?

    En fait, je voudrais que ma liste soit vierge, comme si je m'en servais pour la première fois.
    Je sais pas pk mais je sens que la réponse va être très simple mais que pourtant je ne l'aurais pas vue.

    Merci d'avance.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Citation Envoyé par AureK Voir le message
    Je sais pas pk mais je sens que la réponse va être très simple mais que pourtant je ne l'aurais pas vue.
    Je te le fais pas dire....
    Si t'as déjà des éléments dans ta liste, il faut que tu libères la mémoire utilisée, par ex avec g_list_foreach (ma_list, (GFunc)g_free, NULL); (ça c'est utile uniquement si tu fais des choses genre ma_list = g_list_append (ma_list, g_strdup ("toto"))
    Par contre, il faut faire un g_list_free (ma_list) dans tous les cas (sauf si tu l'utilises encore ailleurs).

    Et pour en revenir à ta question, pour repartir d'une liste vide, c'est tout bêtement ma_list = NULL;

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    En un mot, Merci !

    Alors, maintenant je me demande comment ne pas avoir honte de moi car la manipulation à faire est tellement simple que ...euh... j'avais pas le droit de la rater.

    Ca marche parfaitement, ma liste est bien composé des éléments que je voulais y mettre et non plus de ceux d'avant plus les nouveaux.

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

Discussions similaires

  1. Problème avec les listes chaînées
    Par yous18 dans le forum C
    Réponses: 38
    Dernier message: 25/10/2007, 22h30
  2. Les listes chaînées
    Par dyala dans le forum Langage
    Réponses: 2
    Dernier message: 22/05/2007, 10h09
  3. petit problème sur les listes chaînées
    Par poche dans le forum C
    Réponses: 14
    Dernier message: 19/03/2007, 16h53
  4. [TP 7] Problème avec les listes chaînées (error 202)
    Par thelinekioubeur dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 06/12/2006, 23h15
  5. Réponses: 7
    Dernier message: 22/10/2005, 19h20

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