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 :

Gestion des paramètres callback : effacement des données


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 605
    Par défaut Gestion des paramètres callback : effacement des données
    Bonjour

    J'ai un problème avec l'effacement de la structure passée en callback.

    Voici sa déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    retour=(FenetrePerso *)malloc(sizeof(FenetrePerso));
    Son passage en paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gtk_builder_connect_signals(retour->resume->builder,retour);
    Je ferme la fenêtre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gtk_window_close(GTK_WINDOW(retour->resume->window));
    Puis j'aimerai effacer la structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_free(f_p); /* le f_p est le paramètre retour récupéré par la fonction qui efface */
    Si je ne commente pas la ligne avec le g_free, mon programme plante régulièrement (mais pas toujours) lors de la fermeture des fenêtres. Si je teste avec le déboguer de CodeBllock (sous linux) il m'indique que ça plante au lancement de gtk :
    Pourquoi ? Un erreur cachée dans mon programme ?
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Peux-tu nous montrer la "fonction qui efface " ?

  3. #3
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 605
    Par défaut
    La structure :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    typedef struct
    {
        signed short caract[9];
        signed short race;
        signed short * classe;
        signed short * niveau;
        unsigned long * XP;
        signed short version;
        signed short sexe;
        unsigned short age;
        gchar * nom;
        gchar * joueur;
        gchar * nom_fichier;
        signed short * pdv; /* pouvoir passer par des nombres négatifs dans les calculs et marquer par 0 ou -1 la fin de la liste */
        signed short tab_voleur[FEUILLE_LAR_VOL];
        signed short * competence;
        signed short * niv_competence;
        signed short * arme;
        signed short * niv_arme;
        signed short * mag_arme;
        signed short alignement;
        gchar * cheveux;
        gchar * peau;
        gchar * yeux;
        signed short taille;
        signed short poids;
        signed short * bouclier; /* pointe sur NULL si pas de bouclier, sinon pointe sur un entier : mag du bouclier */
        signed short * bague;    /* pointe sur NULL si pas de bague   , sinon pointe sur un entier : mag de la bague */
        signed short armure1;
        signed short mag_armure1;
        signed short armure2;
        signed short mag_armure2;
        gchar * commentaire;
        gchar * pantheon; /* on ne peut mettre un entier car on peut rajouter des items en cours d'utilisation */
        gchar * dieu;
        signed short ** livre_sorts;
        signed short ** sort_su; /* négatif si pas dans le livre de voyage, 0 si pas du tout, 1 pas regardé, 2 compris, 3 pas compris : voir # define */
        signed short * psi;
        signed short * niv_psi;
        signed short * natif_psi;
     
    } perso;
     
    struct _FenetrePerso
    {
        struct widgets * resume;    /* gestion de la fenêtre résumée                */
        struct widgets * modif;     /* gestion de la fenêtre de modifications       */
        perso perso;
        char ** uri;    /* NULL pour un perso, liste des persos pour un groupe      */
    };                  /* tableau de pointeurs vers les url, NULL pour le dernier  */
     
     
    typedef struct _FenetrePerso Fenetr

    Code pour effacer qui ne fait pas planter :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    void libere_fenetre_perso(FenetrePerso * f_p)
    {
        unsigned short i;
     
        if (f_p->uri!=NULL)
        {
            for (i=0;f_p->uri[i]!=NULL;i++)
            {
                g_free(f_p->uri[i]);
            }
            g_free(f_p->uri);
            f_p->uri=NULL;
        }
        else
        {
        }
        libere_perso(&(f_p->perso));
        /*g_free(f_p);*/
    }
     
    void libere_perso(perso * pers)
    {
        unsigned short i;
        g_free(pers->classe);
        g_free(pers->niveau);
        g_free(pers->XP);
        g_free(pers->nom);
        g_free(pers->joueur);
        g_free(pers->nom_fichier);
        g_free(pers->pdv);
        g_free(pers->competence);
        g_free(pers->niv_competence);
        g_free(pers->arme);
        g_free(pers->niv_arme);
        g_free(pers->mag_arme);
        g_free(pers->cheveux);
        g_free(pers->peau);
        g_free(pers->yeux);
        g_free(pers->bouclier);
        g_free(pers->bague);
        g_free(pers->commentaire);
        g_free(pers->pantheon);
        g_free(pers->dieu);
        if (pers->livre_sorts!=NULL)
        {
            for (i=0;i<9;i++)
            {
                g_free(pers->livre_sorts[i]);
            }
            g_free(pers->livre_sorts);
            pers->livre_sorts=NULL;
        }
        else
        {
        }
        if (pers->sort_su!=NULL)
        {
            for (i=0;i<9;i++)
            {
                g_free(pers->sort_su[i]);
            }
            g_free(pers->sort_su);
            pers->sort_su=NULL;
        }
        else
        {
        }
        g_free(pers->psi); /* pas enore géré */
        g_free(pers->niv_psi);
        g_free(pers->natif_psi);
    }
     
     
     
    void init_perso(perso * pers)
    {
    	pers->nom_fichier=NULL;
    	pers->classe=NULL;
    	pers->niveau=NULL;
    	pers->XP=NULL;
    	pers->pdv=NULL;
    	pers->joueur=NULL;
    	pers->age=0;
    	pers->version=1;
    	pers->sexe=0;
    	pers->nom=g_strdup(""); /* ne pas avoir NULL pour faire la différence avec un perso qui arrive d'un fichier à lire */
    	pers->competence=NULL;
    	pers->niv_competence=NULL;
    	pers->arme=NULL;
    	pers->niv_arme=NULL;
    	pers->mag_arme=NULL;
    	pers->alignement=4;
    	pers->race=0;
    	pers->cheveux=NULL;
    	pers->peau=NULL;
    	pers->yeux=NULL;
    	pers->poids=0;
    	pers->taille=0;
    	pers->bouclier=NULL;
    	pers->bague=NULL;
    	pers->armure1=0;
    	pers->mag_armure1=0;
    	pers->armure2=0;
    	pers->mag_armure2=0;
    	pers->commentaire=NULL;
    	pers->pantheon=NULL;
    	pers->dieu=NULL;
    	pers->livre_sorts=NULL;
    	pers->sort_su=NULL;
    	pers->psi=NULL;
    	pers->niv_psi=NULL;
    	pers->natif_psi=NULL;
    }
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Après une première lecture rapide je n'aime pas trop le fait de mettre à NULL un pointeur transmis en paramètre (f_p dans void libere_fenetre_perso(FenetrePerso * f_p)).

    As-tu tenté d'utiliser Gdb sur ton application pour voir un peu les warnings ?

  5. #5
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 605
    Par défaut
    Il me semble que j'ai modifié le code juste avant que tu ne postes. J'ai même enlevé la mise à NULL du pointeur qui était inutile. Par contre, je l'ai placé juste après l'appel de la fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                    libere_fenetre_perso(retour);
                    retour=NULL;
    Je crois que tu m'as déjà parlé de Gdb... Que n'est pas le gain en décibel j'avoue que ce nom me rappelle quelque chose, mais que je ne sais pas du tout comment on s'en sert. Je n'ai aucun warning à ce niveau lors de la compilation, pourtant, je demande de les avoir tous. Mon seul warning est incompréhensible. Il me dit que j'initialise une variable pour rien alors qu'elle est utilisée par la suite dans la fonction
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  6. #6
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    je ne comprends pas pourquoi tu mets à NULL retour. Ce pointeur pointe toujours sur un espace alloué. Tu vas avoir une fuite mémoire ici.

    Pour Gdb tu peux l'utiliser tout simplement. Tu ajoutes -g lors de la compilation. Puis tu lances ton exécutable avec Gdb : gdb mon_programme.
    Tu accèdes alors à un prompt. Tu lances depuis ce prompt "run". Ton programme se lance. Une fois qu'il a planté tu reviens au prompt. Tu peux alors taper "where" pour savoir où le programme a planté. Il te donnera la ligne exacte dans ton code source. Ensuite tu tapes toujours dans le prompt "continue" ce qui va terminer ton programme qui pour l'instant est bloqué. Enfin tu tapes "quit" pour sortir de Gdb.

    Il existe bien d'autres possibilités mais cette première utilisation te donne l'essentiel : la ligne qui pose problème.

Discussions similaires

  1. Réponses: 12
    Dernier message: 18/01/2010, 18h20
  2. Utiliser des variables statiques pour des paramètres
    Par el_slapper dans le forum VB.NET
    Réponses: 4
    Dernier message: 11/03/2008, 08h55
  3. Recherche des enregistrements en fonction des paramètres
    Par infoctet dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 10/01/2007, 09h51
  4. Réponses: 1
    Dernier message: 22/06/2006, 11h08

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