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 :

J'ai besoin d'aide concernant un bug incompréhensible


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 172
    Par défaut J'ai besoin d'aide concernant un bug incompréhensible
    Bonjour,

    D'habitude je me débrouille tout seul lorsque j'ai un bug de ce type mais ça fait 3 jours que je suis dessus et je n'ai toujours pas avancé d'un yota.

    Voici les bouts de code qui posent problème :
    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
    void modifier_utilisateur(GtkWidget* pWidget, gpointer data)
    {
        Inf* in = data;
        GtkWidget *pboite, *pconf, *pinfo, *hbox1, *hbox2;
        Client nclt;
     
     
        pboite = gtk_dialog_new_with_buttons("Modifier l'utilisateur", NULL, GTK_DIALOG_MODAL, g_locale_to_utf8("Modifier",-1, NULL, NULL, NULL), GTK_RESPONSE_OK, "Annuler", GTK_RESPONSE_CANCEL, NULL);
        gtk_window_set_position (GTK_WINDOW (pboite), GTK_WIN_POS_CENTER);
        hbox1 = gtk_hbox_new(TRUE, 20);
        hbox2 = gtk_hbox_new(TRUE, 20);
        in->entree_login2 = gtk_entry_new();
        in->entree_mdp2 = gtk_entry_new();
        gtk_entry_set_visibility(GTK_ENTRY(in->entree_mdp2), FALSE);
        gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pboite)->vbox), hbox1, TRUE, TRUE, 0);
        gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pboite)->vbox), hbox2, TRUE, TRUE, 0);
        gtk_box_pack_start(GTK_BOX(hbox1), gtk_label_new("Login :"), TRUE, TRUE, 0);
        gtk_box_pack_start(GTK_BOX(hbox1), in->entree_login2, TRUE, TRUE, 0);
        gtk_box_pack_start(GTK_BOX(hbox2), gtk_label_new("Mot de passe :"), TRUE, TRUE, 0);
        gtk_box_pack_start(GTK_BOX(hbox2), in->entree_mdp2, TRUE, TRUE, 0);
        gtk_widget_show_all(GTK_DIALOG(pboite)->vbox);
        if(!in->muet)
            FSOUND_PlaySound(FSOUND_FREE, in->pconnecte);
        if(gtk_dialog_run(GTK_DIALOG(pboite)) == GTK_RESPONSE_OK)
        {
            if(strchr(gtk_entry_get_text(GTK_ENTRY(in->entree_login2)), ' ') || strchr(gtk_entry_get_text(GTK_ENTRY(in->entree_mdp2)), ' '))
            {
                if(!in->muet)
                    FSOUND_PlaySound(FSOUND_FREE, in->pconnecte);
                pinfo = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,GTK_MESSAGE_INFO,GTK_BUTTONS_OK, g_locale_to_utf8("Aucun espace dans le nom ou le mot de passe.",-1, NULL, NULL, NULL));
                gtk_window_set_position (GTK_WINDOW (pinfo), GTK_WIN_POS_CENTER);
                gtk_dialog_run(GTK_DIALOG(pinfo));
                if(!in->muet)
                    FSOUND_PlaySound(FSOUND_FREE, in->psort);
                gtk_widget_destroy(pinfo);
                gtk_widget_destroy(pboite);
                return;
            }
            nclt.nb_messages_envoyes = in->util->nb_messages_envoyes;
            strcpy(nclt.nom,g_locale_from_utf8(gtk_entry_get_text(GTK_ENTRY(in->entree_login2)), -1, NULL, NULL, NULL));
            strcpy(nclt.mdp,g_locale_from_utf8(gtk_entry_get_text(GTK_ENTRY(in->entree_mdp2)), -1, NULL, NULL, NULL));
            nclt.date_inscription[2] = in->util->date_inscription[2];
            nclt.date_inscription[1] = in->util->date_inscription[1];
            nclt.date_inscription[0] = in->util->date_inscription[0];
            nclt.statut = in->util->statut;
            if(ajout_utilisateur(nclt, creer_liste_client()) != -1)
            {
                pconf = gtk_dialog_new_with_buttons("Confirmer la modification", NULL, GTK_DIALOG_MODAL, "Oui", GTK_RESPONSE_OK, "Non", GTK_RESPONSE_NO, NULL);
                gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pconf)->vbox), gtk_label_new(g_locale_to_utf8("Nouvelles données ajoutées.\nSupprimer les anciennes données sur cet utilisateur ?",-1, NULL, NULL, NULL)), TRUE, TRUE, 10);
                gtk_widget_show_all(GTK_DIALOG(pconf)->vbox);
                if(!in->muet)
                    FSOUND_PlaySound(FSOUND_FREE, in->pconnecte);
                printf("1\n");
                if(gtk_dialog_run(GTK_DIALOG(pconf)) == GTK_RESPONSE_OK)
                {
                    printf("2\n");
                    suppression_utilisateur(*in->util, creer_liste_client());
                    actualise_utilisateurs(data);
                    gtk_widget_set_sensitive(in->boutonue,FALSE);
                    gtk_widget_set_sensitive(in->boutonum,FALSE);
                    gtk_label_set_label(GTK_LABEL(in->lnom), "Nom de l'utilisateur");
                    gtk_label_set_label(GTK_LABEL(in->lcreation), g_locale_to_utf8("Date de création",-1, NULL, NULL, NULL));
                    gtk_label_set_label(GTK_LABEL(in->lnbarticles), "Nombre d'articles");
                    gtk_label_set_label(GTK_LABEL(in->letat), "Etat actuel");
                }
                gtk_widget_destroy(pconf);
                actualise_utilisateurs(data);
            }
            else
            {
                pinfo = gtk_message_dialog_new (NULL,GTK_DIALOG_MODAL,GTK_MESSAGE_INFO,GTK_BUTTONS_OK, g_locale_to_utf8("Ce nom est déjà utilisé.",-1, NULL, NULL, NULL));
                gtk_dialog_run(GTK_DIALOG(pinfo));
                gtk_widget_destroy(pinfo);
            }
        }
        gtk_widget_destroy(pboite);
        if(!in->muet)
            FSOUND_PlaySound(FSOUND_FREE, in->psort);
    }
    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
    void creer_utilisateur(GtkWidget* pWidget, gpointer data)
    {
        Inf* in = data;
        GtkWidget *pboite, *pinfo, *hbox1, *hbox2;
        Client clt;
        struct tm today;
        time_t maintenant;
     
     
        pboite = gtk_dialog_new_with_buttons("Nouvel Utilisateur", NULL, GTK_DIALOG_MODAL, g_locale_to_utf8("Créer",-1, NULL, NULL, NULL), GTK_RESPONSE_OK, "Annuler", GTK_RESPONSE_CANCEL, NULL);
        gtk_window_set_position (GTK_WINDOW (pboite), GTK_WIN_POS_CENTER);
        hbox1 = gtk_hbox_new(TRUE, 20);
        hbox2 = gtk_hbox_new(TRUE, 20);
        in->entree_login2 = gtk_entry_new();
        in->entree_mdp2 = gtk_entry_new();
        gtk_entry_set_visibility(GTK_ENTRY(in->entree_mdp2), FALSE);
        gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pboite)->vbox), hbox1, TRUE, TRUE, 0);
        gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pboite)->vbox), hbox2, TRUE, TRUE, 0);
        gtk_box_pack_start(GTK_BOX(hbox1), gtk_label_new("Login :"), TRUE, TRUE, 0);
        gtk_box_pack_start(GTK_BOX(hbox1), in->entree_login2, TRUE, TRUE, 0);
        gtk_box_pack_start(GTK_BOX(hbox2), gtk_label_new("Mot de passe :"), TRUE, TRUE, 0);
        gtk_box_pack_start(GTK_BOX(hbox2), in->entree_mdp2, TRUE, TRUE, 0);
        gtk_widget_show_all(GTK_DIALOG(pboite)->vbox);
        if(!in->muet)
            FSOUND_PlaySound(FSOUND_FREE, in->pconnecte);
        if(gtk_dialog_run(GTK_DIALOG(pboite)) == GTK_RESPONSE_OK)
        {
            if(strchr(gtk_entry_get_text(GTK_ENTRY(in->entree_login2)), ' ') || strchr(gtk_entry_get_text(GTK_ENTRY(in->entree_mdp2)), ' '))
            {
                if(!in->muet)
                    FSOUND_PlaySound(FSOUND_FREE, in->pconnecte);
                pinfo = gtk_message_dialog_new (GTK_WINDOW(pboite),GTK_DIALOG_MODAL,GTK_MESSAGE_INFO,GTK_BUTTONS_OK, g_locale_to_utf8("Aucun espace dans le nom ou le mot de passe.",-1, NULL, NULL, NULL));
                gtk_dialog_run(GTK_DIALOG(pinfo));
                if(!in->muet)
                    FSOUND_PlaySound(FSOUND_FREE, in->psort);
                gtk_widget_destroy(pinfo);
                gtk_widget_destroy(pboite);
                return;
            }
            clt.nb_messages_envoyes = 0;
            strcpy(clt.nom,g_locale_from_utf8(gtk_entry_get_text(GTK_ENTRY(in->entree_login2)), -1, NULL, NULL, NULL));
            strcpy(clt.mdp,g_locale_from_utf8(gtk_entry_get_text(GTK_ENTRY(in->entree_mdp2)), -1, NULL, NULL, NULL));
            time(&maintenant);
            today = *localtime(&maintenant);
            clt.date_inscription[2] = today.tm_year + 1900;
            clt.date_inscription[1] = today.tm_mon + 1;
            clt.date_inscription[0] = today.tm_mday;
            clt.statut=0;
            if(ajout_utilisateur(clt, creer_liste_client()) != -1)
            {
                actualise_utilisateurs(data);
            }
            else
            {
                if(!in->muet)
                    FSOUND_PlaySound(FSOUND_FREE, in->pconnecte);
                pinfo = gtk_message_dialog_new (GTK_WINDOW(pboite),GTK_DIALOG_MODAL,GTK_MESSAGE_INFO,GTK_BUTTONS_OK, g_locale_to_utf8("Ce nom est déjà utilisé.",-1, NULL, NULL, NULL));
                gtk_dialog_run(GTK_DIALOG(pinfo));
                gtk_widget_destroy(pinfo);
            }
        }
        if(!in->muet)
            FSOUND_PlaySound(FSOUND_FREE, in->psort);
        gtk_widget_destroy(pboite);
        printf("3\n");
    }
    Voici la déclaration de la structure Client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef struct client
    {
    	int nb_messages_envoyes;
    	int date_inscription[3]; // jour mois annee
    	char nom[1000];
    	char mdp[1000];
    	int statut;
    }Client;
    Le programme plante entre 1 et 2 dans modifier_utilisateur et après 3 dans creer_utilisateur.
    Les 2 fonctions sont des callback reliée à des boutons.

    Parfois le programme plante, parfois il ne plante pas, ce qui est caractéristiques des bugs de mémoire.
    Quelque part dans le programme, je dois écrire dans une zone mémoire qui ne m'est pas allouée, mais pas moyen de trouver où...
    J'ai vraiment besoin d'aide sur ce coup, parceque moi j'suis en train de baisser les bras :-/
    Le programme fait environ 2500 lignes de codes, donc je peux évidement pas tout mettre sur ce topic. Mais si il vous faut un renseignement supplémentaire, demandez-moi, j'le rajouterai.

    Merci d'avance à tous ceux qui pourront m'aider à résoudre ce mystère.

    PS : Comme si ça ne suffisait pas, ce détail vient épaissir le mystère : Quand je fais tourner le programme avec gdb, celui-ci ne remarque rien d'anormal et le programme se porte à merveille !
    Mais dès que je le fais tourner normalement, les bugs recommencent...

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Par défaut
    Salut,

    Je connais ce genre de problèmes car j'ai moi aussi un programme de quelques 2000 lignes lol.

    Lorsque j'ai ce genre de problèmes, je procède toujours de la même manière et en général ca fonctionne.

    1) J'utilise ddd. Mais avec un programme graphique comme GTK+, ca n'est pas super car tu ne peux pas suivre pas à pas le déroulement du programme.

    2) Je regarde à partir de quand mon programme a commencé à bugguer. Je repars à partir du moment où il était fonctionnel et j'ajoute pas à pas mes nouvelles lignes de code jusqu'à ce que ça pose problème et en général tu vois assez facilement d'où ca vient. (Ou aussi le traditionnel printf( ) par ci par là ou alors la mise en commentaire de certaines lignes de ton code)

    Voilà, si jamais ça ne marche toujours pas, j'essaierai peut-être si j'ai le temps de regarder ton code plus en détail

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 172
    Par défaut
    Merci pour ta réponse
    J'ai fait comme tu me l'as conseillé, et j'ai mis entre commentaires une à une toutes les fonctionnalités de mon programme en testant si ça plantait toujours, jusqu'à ce qu'il ne me reste plus que la gestion des utilisateurs...

    Je n'arrive pas à voir d'où vient le problème, mais une chose est sûre, il est local...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 172
    Par défaut
    Une petite précision : la structure Inf est ma petite méthode pour éviter les variables globales : elle contient en fait tous les pointeurs de Widget du programme.
    Au début du main, je fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     in = (Inf*)malloc(sizeof(Inf));
    et je passe ensuite cette structure en argument à toutes mes callback.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Par défaut
    Entre 1 et 2 tu dis ? J'ai regardé ton code je ne vois pas très bien ce qui peut être en cause. Es tu sur que GTK_RESPONSE_OK est adapté pour comparer à la valeur de retour de gtk_dialog_run ?

    J'ai vu sur la documentation que l'usage général est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      gint result = gtk_dialog_run (GTK_DIALOG (dialog));
      switch (result)
        {
          case GTK_RESPONSE_ACCEPT:
             do_application_specific_something ();
             break;
          default:
             do_nothing_since_dialog_was_cancelled ();
             break;
        }
      gtk_widget_destroy (dialog);
    Donc essaye peut-être avec GTK_RESPONSE_ACCEPT même si je doute que ça y change quelquechose.

    PS: lis en détail la doc de gtk_dialog_run car il me semble qu'elle change pas mal de choses quant à l'exécution standard d'un programme : http://library.gnome.org/devel/gtk/2...gtk-dialog-run

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 172
    Par défaut
    En effet ça n'a pas grande incidence... En fait, mon petit doigt me dit que gtk_dialog_run n'est que la partie émergée de l'iceberg. Avant cela, il se pourrait que j'écrive sur une partie de mémoire non-alouée, puis gtk_dialog_run utilise cette partie de la mémoire...

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

Discussions similaires

  1. besoin d'aide concernant le cv
    Par bassem2008 dans le forum CV
    Réponses: 1
    Dernier message: 19/04/2008, 16h02
  2. Besoin d'aide concernant l'utilisation de thread
    Par romain69 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 06/03/2008, 17h21
  3. besoin d'aide concernant masterpage
    Par giannichedda dans le forum ASP.NET
    Réponses: 4
    Dernier message: 08/08/2007, 12h13
  4. Besoin d'aide concernant le diapo Flash.
    Par simplyme dans le forum Flash
    Réponses: 3
    Dernier message: 31/10/2006, 20h22
  5. Besoin d'aide concernant 1 exo
    Par Shakan972 dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 29/11/2005, 11h31

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