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 :

GList liste mal remplie


Sujet :

GTK+ avec C & C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 40
    Par défaut GList liste mal remplie
    salut à tous,
    g un prog en gtk qui manipule une combo.
    Avant de me lancer dans son remplissage via c-gtk, j'ai mis au point la lecture des items via un fichier sous le mode console.
    Après je n'avais plus qu'à faire des changements de variables et retirer les instructions propres au monde console.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    while (!feof(pfile))
            {//tant qu'on n'a pas atteint la fin du fichier   
                if (fgets(ligne_a_lire,TAILLE_BUFF,pfile)!=NULL)
                { //une ligne existe 
                    list_cat=g_list_append(list_cat,ligne_a_lire);               
                } 
            } 
    fclose(pfile);   
     
        c_combo=gtk_combo_new();
        gtk_box_pack_start(GTK_BOX(pBox), c_combo, FALSE, FALSE, 0);
     
        //Envoi de la liste des catégories dans la ComboBox 
        gtk_combo_set_popdown_strings(GTK_COMBO(c_combo),list_cat);
    Le problème est le suivant: les items chargés dans la combo sont erronnés. En fait ça me copie n fois la dernière ligne lue dans le fichier. Sauriez-vous pourquoi?
    merci

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Salut !

    Je ne sais pas si ton problème est déjà résolu mais voici comment j'aurais procédé:
    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
          while (fgets (buf, TAILLE_BUFF, file) != NULL)
          {
             char * c       = NULL;
             char * tmp_buf = NULL;
     
     
             /* On enleve l'eventuel saut de ligne '\n' */
             if ((c = strchr (buf, '\n')) != NULL)
             {
                *c = 0;
             }
     
     
             tmp_buf = g_malloc (strlen (buf) + 1);
     
             if (tmp_buf != NULL)
             {
                strcpy (tmp_buf, buf);
                list_cat = g_list_append (list_cat, tmp_buf);
             }
          }
     
          fclose (file);
    En fait, tu ne fait que passer un pointeur à la fonction g_list_append pour le text donc de ce fait, vu que le tableau est mis à jour à chaque itération de la boucle hé bin ca donne ton erreur.

    Comme j'ai fait, cela fonctionne mais lors de la fermeture de la liste il ne faut pas oublier de libérer l'adresse mémoire de chaque noeud de celle-ci !

    Tel est mon devoir, je me doit de te signaler que tu utilises tout de même un widget déprécié, qui n'est donc plus à utiliser pour les nouveaux développements, il y'a les GtkComboBox et les GtkComboBoxEntry qui le remplace !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 40
    Par défaut nouveaux widgets
    Oui sans doute ce serait mieux avec la nouvelle version de gtk, mais hélas je dois m'en tenir à la version qu'on m'impose
    En tout cas merci je vais tester ta solution.
    if (tmp_buf != NULL)
    {
    strcpy (tmp_buf, buf);
    list_cat = g_list_append (list_cat, tmp_buf);
    }
    A quoi sert la première instruction par contre?

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par ladygtk
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (tmp_buf != NULL)
    {
       strcpy (tmp_buf, buf);
       list_cat = g_list_append (list_cat, tmp_buf);
    }
    A quoi sert la première instruction par contre?
    Vu qu'on alloue une chaîne pour chaque noeud de la liste, il faut bien remplir cette adresse avec une chaîne, ici on copie simplement la chaîne source (buf) dans à l'adresse de la chaîne but (tmp_buf)

    Le problème que tu avais avec ton code, c'est que tu donnais directement le pointeur contenant la chaîne d'origine mais vu que ce pointeur est mis à jour à chaque itération de ta boucle tu finissais avec une liste contenant la même chaîne à chacuns de ses noeuds
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

Discussions similaires

  1. Réponses: 6
    Dernier message: 13/11/2007, 17h04
  2. Liste déroulante remplie un champs texte
    Par tukutt dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 22/02/2007, 15h52
  3. DropDown List non remplie :(
    Par Nadaa dans le forum ASP.NET
    Réponses: 3
    Dernier message: 30/01/2007, 16h26
  4. listes mal gérées sous fox
    Par grinder59 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 11/09/2006, 14h48
  5. [Tiles]message d'erreur dans un footer (form mal rempli)
    Par clement42 dans le forum Struts 1
    Réponses: 5
    Dernier message: 09/06/2005, 14h51

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