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 :

Aide sur gchar* dans GList


Sujet :

GTK+ avec C & C++

  1. #1
    Membre averti
    Homme Profil pro
    Géomaticien
    Inscrit en
    Février 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Géomaticien

    Informations forums :
    Inscription : Février 2010
    Messages : 63
    Par défaut Aide sur gchar* et structure dans GList
    Salut la communauté,

    J'ai un petit problème avec les GList. En fait je souhaite stocker dans une GList les informations dans un tableau de char (une string quoi). Je sais qu'on ne peut y adjoindre directement la variable puisqu'on ne récupère que le pointeur, donc j'essaie par allocation de mémoire, mais le programme cause une erreur de segmentation au moment de l'ajout la donnée dans la GList. Voici ce que j'ai fait pour l'instant :

    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
     
     
        gint   i = 1;
        GList *glstEntry;
     
        gchar *Store = g_strrstr (ReturnInfo, "Entrées:"); /* ReturnInfo est une gchar retournée par une fonction */
        gchar **Split = g_strsplit (Store, "\n", -1);
     
     
        while (Split[i] != '\0')
        {
    	gchar *temp  = g_malloc (strlen (Split[i]) + 1);
    	g_stpcpy (temp, (gchar *) Split[i]);
    	glstEntry = g_list_append (glstEntry, temp);
     
    	i++;
    	g_free (temp);
        }
     
        g_strfreev (Split);
    Merci pour l'aide.

  2. #2
    Membre Expert
    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
    Par défaut
    Tu peux utiliser g_strdup plutôt que malloc/strlen/strcpy, ça évitera de possibles erreurs Je changerais le test de fin de boucle par (Split[i] != NULL), je trouve ça un peu plus lisible dans ce cas (vu que Split[i] n'est pas un caractère mais un pointeur). Et il faut que ta GList soit initialisée à NULL avant que tu ne l'utilises.

  3. #3
    Membre averti
    Homme Profil pro
    Géomaticien
    Inscrit en
    Février 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Géomaticien

    Informations forums :
    Inscription : Février 2010
    Messages : 63
    Par défaut
    Ah, je suis un peu idiot sur le coup... j'ai mal exposé mon problème, car j'avais essayé d'ajouter une donnée dans une GList qui est elle-même contenue dans une structure. J'ai eu de curieux résultats aléatoires qui ne se produisait pas uniquement au niveau de la GList, mais qui modifiait ma variable ReturnInfo ! Très curieux comme problème... En passant par une GList temporaire cela marche.

    En tout cas merci à toi teuf !

  4. #4
    Membre Expert
    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
    Par défaut
    La GList dans ta structure est initialement NULL? Y Tu fais probablement un truc "bizarre" avec un pointeur dans un coin si ReturnInfo se retrouve modifiée. Ton problème est résolu alors?

  5. #5
    Membre averti
    Homme Profil pro
    Géomaticien
    Inscrit en
    Février 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Géomaticien

    Informations forums :
    Inscription : Février 2010
    Messages : 63
    Par défaut
    Citation Envoyé par teuf13 Voir le message
    La GList dans ta structure est initialement NULL?
    Et bien, premier problème que j'ai rencontré avec les GList. J'initialisais à NULL dans la structure, la compilation échouait.
    Secundo, si je l'initialise en créant en une variable utilisant la structure, c'est là que je rencontrais ce problème aléatoire.

    Citation Envoyé par teuf13 Voir le message
    Y Tu fais probablement un truc "bizarre" avec un pointeur dans un coin si ReturnInfo se retrouve modifiée. Ton problème est résolu alors?
    Probable ? Je vais voir. A vrai dire, ReturnInfo est dans mon code retournée par une fonction, mais là je l'ai fait sans passer par une variable, or la variable retournée doit être libéré lorsqu'elle inusitée. Peut-être est-ce là ? Mais c'est curieux le fait d'utiliser une GList peut perturber cette variable qui sont a priori indépendante l'une de l'autre. Quel est ton avis ?

  6. #6
    Membre Expert
    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
    Par défaut
    Si tu utilises mal les pointeurs, tu peux changer n'importe quelle variable sans t'en rentre compte. Et si tu renvoies une variable locale comme valeur de retour d'une fonction, ça ne va pas marcher effectivement.

  7. #7
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Il vaudrait mieux qu'il reposte son nouveau code, mais effectivement le code de départ ne peut fonctionner si sa GList de départ n'est pas initialisée à NULL.

  8. #8
    Membre averti
    Homme Profil pro
    Géomaticien
    Inscrit en
    Février 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Géomaticien

    Informations forums :
    Inscription : Février 2010
    Messages : 63
    Par défaut
    Citation Envoyé par teuf13 Voir le message
    Si tu utilises mal les pointeurs, tu peux changer n'importe quelle variable sans t'en rentre compte. Et si tu renvoies une variable locale comme valeur de retour d'une fonction, ça ne va pas marcher effectivement.
    En gros si je comprend bien, c'est parce que j'utilise une gchar* à mémoire allouée et donc à libérer avec g_free(). Je tâcherai de la dupliquer.
    Deuxièmement, il faut aussi que je duplique la GList avant de la stocker dans ma structure. Mais pourquoi ce n'est pas possible d'initialiser à NULL une GList dans l'élaboration de la structure ? (compilation qui échoue)
    On va dire que mon problème et résolu, puisque tout semble fonctionner et qu'aucun souci ne m'empêche de progresser dans l'élaboration du programme.

    Par contre, j'ai une autre question, toujours sur les GList. Est-ce commode d'utiliser une GList qui remferme une variable structure qui elle-même se compose d'une GList ? Est-ce que ça va m'apporter des problèmes de pointeurs et/ou de performance, ou il vaut mieux éviter ?

    Edit : autre chose qui pouvait poser problème, c'est que je n'ai pas alloué de la mémoire pour ma structure avec g_slice_new, ptêt pour ça aussi...

  9. #9
    Membre Expert
    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
    Par défaut
    Citation Envoyé par Moravski Voir le message
    En gros si je comprend bien, c'est parce que j'utilise une gchar* à mémoire allouée et donc à libérer avec g_free(). Je tâcherai de la dupliquer.
    Deuxièmement, il faut aussi que je duplique la GList avant de la stocker dans ma structure.
    Si c'est de la mémoire que tu as alloué, il n'y a rien à dupliquer, tu peux renvoyer le pointeur tel quel.

    Mais pourquoi ce n'est pas possible d'initialiser à NULL une GList dans l'élaboration de la structure ? (compilation qui échoue)
    C'est possible, il faut mettre GList * dans ta structure, pas GList et ça devrait bien se passer.

    Par contre, j'ai une autre question, toujours sur les GList. Est-ce commode d'utiliser une GList qui remferme une variable structure qui elle-même se compose d'une GList ? Est-ce que ça va m'apporter des problèmes de pointeurs et/ou de performance, ou il vaut mieux éviter ?
    Si tu t'embrouilles dans tous ces pointeurs, oui ça va poser des pbs Sinon pourquoi pas. En gardant bien en tête ce qui est performant avec une GList/liste chaînée et ce qui ne l'est pas (ie éviter les g_list_length et g_list_nth au maximum)

    Edit : autre chose qui pouvait poser problème, c'est que je n'ai pas alloué de la mémoire pour ma structure avec g_slice_new, ptêt pour ça aussi...
    Si tu as fait un malloc/g_malloc/g_new0 pour l'allouer, ça ne devrait pas poser de soucis

  10. #10
    Membre averti
    Homme Profil pro
    Géomaticien
    Inscrit en
    Février 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Géomaticien

    Informations forums :
    Inscription : Février 2010
    Messages : 63
    Par défaut
    Salut teuf,

    Citation Envoyé par teuf13 Voir le message
    C'est possible, il faut mettre GList * dans ta structure, pas GList et ça devrait bien se passer.
    et bien j'ai essayé cela ne marche pas, la compilation échoue, pour une raison qui m'échappe. Je t'invite à essayer.

    Bon, pour en revenir à mon stockage de structure dans la GList, et bien... j'ai des soucis
    Je n'arrive pas à la stocker correctement dans un premier temps. Je vous montre ce que j'ai fait, sachant que ma fonction sert à récupérer tous les éléments d'un Gtk Treeview, composé de 2 colonnes, ID et Nom :

    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
    24
    25
    26
    27
    28
    29
    GList*
    entity_get_name_id (GtkTreeView *TreeView)
    {
        GtkTreeModel	*Model = gtk_tree_view_get_model (TreeView);
        GtkTreeIter		pIter;
        GList		*List = NULL;
        guint		i = 0;
     
        gtk_tree_model_get_iter_first (Model, &pIter);
     
        do {
    	gchar *ID, *Name;
    	EntityStruct *EntityInfo = g_slice_new (EntityStruct);
     
    	gtk_tree_model_get (Model, &pIter, 0, &ID, 1, &Name, -1);
    	EntityInfo->Name = Name;
    	EntityInfo->ID = ID;
    	List = g_list_append (List, EntityInfo);
     
    	g_free (ID);
    	g_free (Name);
    	g_slice_free (EntityStruct, EntityInfo);
        } while (gtk_tree_model_iter_next (Model, &pIter));
     
        EntityStruct *DebugPrint = (EntityStruct *) g_list_nth_data (List, 2);
        g_print ("%s\n", DebugPrint->Name); /* Là c'est pour tester si j'ai correctement stocké la structure */
     
        return List;
    }
    Voici ma structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct
    {
        gchar	*Name;
        gchar	*ID;
     
    }EntityStruct;
    Lorsque je teste la fonction, au lieu de récupérer une belle gchar* issue d'une variable structure stockée dans la liste, j'ai une série de caractères incompréhensibles.

  11. #11
    Membre Expert
    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
    Par défaut
    Citation Envoyé par Moravski Voir le message
    et bien j'ai essayé cela ne marche pas, la compilation échoue, pour une raison qui m'échappe. Je t'invite à essayer.
    Je t'invite surtout à poster du code qui ne fonctionne pas, je suis sûr que ça va marcher si j'essaie


    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
    GList*
     
        do {
    	gchar *ID, *Name;
    	EntityStruct *EntityInfo = g_slice_new (EntityStruct);
     
    	gtk_tree_model_get (Model, &pIter, 0, &ID, 1, &Name, -1);
    	EntityInfo->Name = Name;
    	EntityInfo->ID = ID;
    	List = g_list_append (List, EntityInfo);
     
    	g_free (ID);
    	g_free (Name);
    	g_slice_free (EntityStruct, EntityInfo);
        } while (gtk_tree_model_iter_next (Model, &pIter));
    Tu libères la mémoire sur laquelle pointe EntityInfo->Name et EntityInfo->ID juste après les avoir stockés dans une liste chaînée, donc quand tu les affiches, la mémoire sur laquelle ils pointent est indéfinie.

  12. #12
    Membre averti
    Homme Profil pro
    Géomaticien
    Inscrit en
    Février 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Géomaticien

    Informations forums :
    Inscription : Février 2010
    Messages : 63
    Par défaut
    Citation Envoyé par teuf13 Voir le message
    Je t'invite surtout à poster du code qui ne fonctionne pas, je suis sûr que ça va marcher si j'essaie
    OK, je te montrerai probablement ce soir.

    Citation Envoyé par teuf13 Voir le message
    Tu libères la mémoire sur laquelle pointe EntityInfo->Name et EntityInfo->ID juste après les avoir stockés dans une liste chaînée, donc quand tu les affiches, la mémoire sur laquelle ils pointent est indéfinie.
    Justement, je suis obligé pour pouvoir accueillir les nouvelles données de libérer et de réallouer de la mémoire pour la variable temporaire. Après c'est justement le point où j'ai un peu de mal, je sais bien que les données dans les GList sont stockés sous forme de gpointer, tu supprimes la variable pointée, tu perds la donnée sensée être récupérée à travers la GList. J'ai essayé de comprendre, je vois mal dans mon cas comment je peux stocker la donnée elle-même et non le pointeur, c'est là où j'ai besoin d'aide. Je ne vois vraiment pas comment je pourrais sans passer par une tripotée de variables globales (donc à éviter comme la peste), ou je devrais m'orienter vers une piste autre que GList ?

  13. #13
    Membre Expert
    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
    Par défaut
    Citation Envoyé par Moravski Voir le message
    Justement, je suis obligé pour pouvoir accueillir les nouvelles données de libérer et de réallouer de la mémoire pour la variable temporaire.
    Je comprends pas ce que tu veux dire :-/

    Après c'est justement le point où j'ai un peu de mal, je sais bien que les données dans les GList sont stockés sous forme de gpointer, tu supprimes la variable pointée, tu perds la donnée sensée être récupérée à travers la GList. J'ai essayé de comprendre, je vois mal dans mon cas comment je peux stocker la donnée elle-même et non le pointeur, c'est là où j'ai besoin d'aide.
    Hmm, après le gtk_tree_model_get, tu récupères un pointeur sur une zone de mémoire qui a été allouée et qu'il faut que tu libères toi-même. Le fait que la libération de la mémoire soit à ta charge implique que la zone mémoire allouée "t'appartient", ie tu peux la garder en vie (ne pas la désallouer) aussi longtemps que tu veux. Un pointeur, c'est juste un moyen d'accéder à cette donnée, le fait que ta variable de type pointeur ne soit plus valide (ie variable locale hors du bloc où elle est définie) ne change rien quant aux possibilités d'accéder à cette zone mémoire.
    Tout ça pour dire que dans ton cas, si tu stockes un pointeur vers la zone mémoire que gtk_tree_model_get t'asattribuée dans ta glist, la zone mémoire et le pointeur que tu as stocké resteront valides aussi longtemps que tu veux. Donc en gros, tu n'as "rien à faire" supprimer les g_free (pour les remettre au moment de la destruction de la liste) devrait être suffisant.

    C'est une tentative d'expliquer ce que je pense que tu as mal compris, je suis peut être très obscur ou à côté de la plaque, n'hésite pas à poser d'autres questions pour bien comprendre ce qu'il faut faire dans ce cas (c'est important à mon avis pour bien comprendre les pointeurs)

  14. #14
    Membre averti
    Homme Profil pro
    Géomaticien
    Inscrit en
    Février 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Géomaticien

    Informations forums :
    Inscription : Février 2010
    Messages : 63
    Par défaut
    Citation Envoyé par teuf13 Voir le message
    Je comprends pas ce que tu veux dire :-/
    Et bien je pensais qu'il fallait libérer la mémoire allouée avant de réattribuer la variable pour poursuivre ma boucle, mais j'ai compris de ce que tu m'as dit où était mon erreur dans mon raisonnement. C'est donc la source de mon erreur. Il faut que j'attribue (si je le veux) la mémoire en dehors de ma boucle, c'est pourquoi cela ne marchait pas. J'espère que je suis clair en retour, et que tu as compris mon raisonnement erroné

    Bref, maintenant que j'ai mieux compris, cela fonctionne. Merci ! Voici mon nouveau code pour ne pas te mentir :

    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
    24
    25
    26
    27
    GList*
    entity_get_name_id (GtkTreeView *TreeView)
    {
        GtkTreeModel	*Model = gtk_tree_view_get_model (TreeView);
        GtkTreeIter		pIter;
        GList		*List = NULL;
        guint		i = 0;
        EntityStruct *EntityInfo = g_slice_new (EntityStruct);
        EntityStruct *DebugPrint = g_slice_new (EntityStruct);
     
        gtk_tree_model_get_iter_first (Model, &pIter);
     
        do {
    	gchar *ID, *Name;
     
    	gtk_tree_model_get (Model, &pIter, 0, &ID, 1, &Name, -1);
    	EntityInfo->Name = Name;
    	EntityInfo->ID = ID;
    	List = g_list_append (List, EntityInfo);
     
        } while (gtk_tree_model_iter_next (Model, &pIter));
     
        DebugPrint = (EntityStruct *) g_list_nth_data (List, 2);
        g_print ("%s\n", DebugPrint->Name); /* Là c'est pour tester si j'ai correctement stocké la structure */
     
        return List;
    }
    Citation Envoyé par teuf13 Voir le message
    Hmm, après le gtk_tree_model_get, tu récupères un pointeur sur une zone de mémoire qui a été allouée et qu'il faut que tu libères toi-même. Le fait que la libération de la mémoire soit à ta charge implique que la zone mémoire allouée "t'appartient", ie tu peux la garder en vie (ne pas la désallouer) aussi longtemps que tu veux. Un pointeur, c'est juste un moyen d'accéder à cette donnée, le fait que ta variable de type pointeur ne soit plus valide (ie variable locale hors du bloc où elle est définie) ne change rien quant aux possibilités d'accéder à cette zone mémoire.
    Tout ça pour dire que dans ton cas, si tu stockes un pointeur vers la zone mémoire que gtk_tree_model_get t'asattribuée dans ta glist, la zone mémoire et le pointeur que tu as stocké resteront valides aussi longtemps que tu veux. Donc en gros, tu n'as "rien à faire" supprimer les g_free (pour les remettre au moment de la destruction de la liste) devrait être suffisant.

    C'est une tentative d'expliquer ce que je pense que tu as mal compris, je suis peut être très obscur ou à côté de la plaque, n'hésite pas à poser d'autres questions pour bien comprendre ce qu'il faut faire dans ce cas (c'est important à mon avis pour bien comprendre les pointeurs)
    OK, tu n'es pas du tout obscur, je comprend mieux mon erreur. Par contre, j'aimerai savoir si je dois libérer la mémoire allouée pour ma structure à la fin de ma fonction ou c'est inutile, cela sera fait au moment de le destruction de ma GList.
    Finalement, j'ai bien fait de passer par les GList, au moins ça me fait une mise au point sur la gestion des pointeurs.

    Je continuerai probablement te poser quelques questions pour que tout soit clair. J'espère que ça ne te dérange pas.

    Edit : bah non, j'ai été trop vite en besogne Si j'arrive bien à récupérer correctement quelque chose, en fait chaque élément pointe vers... la dernière entrée dans ma liste Arf...

  15. #15
    Membre Expert
    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
    Par défaut
    Citation Envoyé par Moravski Voir le message
    Par contre, j'aimerai savoir si je dois libérer la mémoire allouée pour ma structure à la fin de ma fonction ou c'est inutile, cela sera fait au moment de le destruction de ma GList.
    g_list_append stocke prend juste la valeur du pointeur que tu lui passes en argument et le stocke dans la GList. Donc il faut que la zone mémoire correspondant au pointeur que tu ajoutes à la GList reste valide aussi longtemps que tu en as besoin (ie qu'elle soit uniquement désallouée au moment où tu n'en as plus besoin). Donc au moment de la destruction de la liste. Au moment où tu désalloues la mémoire utilisée par ta structure, il ne faut pas oublier d'aussi désallouer la mémoire utilisée par Name et ID vu qu'après tu ne pourras plus y accéder. g_list_foreach est généralement utile pour libérer la mémoire utilisée pour chaque élément d'une GList.

  16. #16
    Membre averti
    Homme Profil pro
    Géomaticien
    Inscrit en
    Février 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Géomaticien

    Informations forums :
    Inscription : Février 2010
    Messages : 63
    Par défaut
    Salut,

    Je crois que tu n'as pas vu mon edit. Je me retrouve avec une GList qui pointe toujours pour tous les éléments sur la dernière entrée de mon Treeview. J'ai essayé en dupliquant mes variables ID et Name, cela ne change rien au résultat.

  17. #17
    Membre Expert
    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
    Par défaut
    Ah oui j'avais pas vu l'edit Il faudrait faire des dessins avec des boites (correspondant à al mémoire allouée) et des flèches (correspondant aux pointeurs) pour bien t'expliquer.
    Mais tu veux une structure différente pour chaque élément dans ta liste, si tu gardes un pointeur sur la même zone mémoire pendant la totalité de ta boucle, tu vas effectivemnet toujours modifier la même structure. Si tu veux une structure différente pour chaque élément de ta liste, il faut réallouer de la mémoire à chaque itération de la boucle.

  18. #18
    Membre averti
    Homme Profil pro
    Géomaticien
    Inscrit en
    Février 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Géomaticien

    Informations forums :
    Inscription : Février 2010
    Messages : 63
    Par défaut
    Ah ouiiiiiiiiii ! Bon sang mais c'est bien sûr ! En fait je suis parti loin et faux surtout ! Si je reprend ma fonction au début, j'avais juste à supprimer les free, et c'était bon ! Là ça marche ! Merci encore une fois teuf. Désolé si j'ai pas pigé immédiatement tes explications pourtant claires.

    Enfin, si je veux désallouer la mémoire des éléments de ma GList, donc il faut que je parcours dans une boucle tous les éléments, que j'utilise g_slice_free et ensuite je peux libérer la mémoire de ma GList. C'est bien ça ?

  19. #19
    Membre Expert
    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
    Par défaut
    Tout à fait, enfin pour chaque élément de ta liste, tu utiliseras 2 fois g_free puis g_slice_free pour libérer ta structure, et une fois que tu auras libéré toute cette mémoire, tu pourras effectivement détruire ta liste. Comme dit tout à l'heure, g_list_foreach peut être utile pour ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void free_one_elem (gpointer data)
    {
        MyStruct *s = (MyStruct *)data;
        g_free (s->ID);
        g_free (s->Name):
        g_slice_free (s);
    }
     
    g_list_foreach (my_list, (GFunc)free_one_elem, NULL);
    g_list_free (my_list);

Discussions similaires

  1. [XL-2010] Aide sur graph dans excel
    Par jessfranzle dans le forum Excel
    Réponses: 1
    Dernier message: 01/08/2013, 09h14
  2. Aide sur VLOOKUP dans vba
    Par Mag555 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 25/08/2011, 14h35
  3. Aide sur placement dans un gridbaglayout
    Par Micke7 dans le forum Agents de placement/Fenêtres
    Réponses: 14
    Dernier message: 21/04/2010, 10h36
  4. Aide sur datagrid dans VB6/Mysql
    Par scm10 dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 14/03/2009, 15h12
  5. VBA Word - Aide sur les "Retours" dans tableaux
    Par wouebmaster dans le forum VBA Word
    Réponses: 5
    Dernier message: 29/12/2005, 10h08

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