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++

  1. #1
    Membre régulier
    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
    Points : 117
    Points
    117
    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 régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Points : 116
    Points
    116
    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 régulier
    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
    Points : 117
    Points
    117
    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 régulier
    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
    Points : 117
    Points
    117
    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 régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Points : 116
    Points
    116
    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 régulier
    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
    Points : 117
    Points
    117
    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...

  7. #7
    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
    Pour les pb de mémoire, si tu es sous linux, valgrind fait des merveilles (et même plus que ça)

  8. #8
    Membre régulier
    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
    Points : 117
    Points
    117
    Par défaut
    Y a un équivalent pour Windows Vista ?

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    ouais. Installer linux

    Ok je sors -->

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

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

    Si ton bug n'est pas encore résolu et si ton code n'est pas confidentiel, je veux bien que tu me l'envoie (je ne sais pas encore comment sur dvpez.com lol).

    J'essaierai de le compiler sous linux et de l'utiliser avec valgrind pour y trouver le bug.

    PS: et envoie aussi la lib des fsound avec stp ^^

  11. #11
    Membre régulier
    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
    Points : 117
    Points
    117
    Par défaut
    ok merci, j't'enverrai les liens par PM

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Points : 116
    Points
    116
    Par défaut
    Hello,

    Bon j'ai un peu dégrossi le code et j'ai trouvé quelques erreurs que voici :

    1) Dans le login : (fonction authentification)

    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
     
            login = g_locale_to_utf8(((in->liste_clients)+i)->nom,-1, NULL, NULL, NULL);
            motdp = g_locale_to_utf8(((in->liste_clients)+i)->mdp,-1, NULL, NULL, NULL);
     
      if(login!=NULL) // RAJOUT
      {
           if(strcmp(lg, login) == 0)
           {
              if(motdp!=NULL) // RAJOUT
              {
                  if(strcmp(mp, motdp) == 0)
                  {
                   in->moi->nb_messages_envoyes=((in->liste_clients)+i)->nb_messages_envoyes;
                    strcpy(in->moi->nom,((in->liste_clients)+i)->nom);
                    strcpy(in->moi->mdp,((in->liste_clients)+i)->mdp);
                    in->moi->date_inscription[0]=((in->liste_clients)+i)->date_inscription[0];
                    in->moi->date_inscription[1]=((in->liste_clients)+i)->date_inscription[1];
                    in->moi->date_inscription[2]=((in->liste_clients)+i)->date_inscription[2];
                    in->moi->statut=((in->liste_clients)+i)->statut;
                    modif_statut(*in->moi, in->liste_clients, 1);
                    return 1;
                  }
                  else
                      break;
              }
         }
    }
    Tu ne testais pas si le champ était différent de NULL, donc si j'ouvrais ton application et dès que je faisais entrée, segmentation fault car strcmp essaye de comparer NULL.


    2) J'ai trouvé d'où provenait l'erreur après le " 3 " comme tu disais (fonction actualise_utilisateurs) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        for(t=0; ((in->liste_clients)+t)->nb_messages_envoyes != -1; t++)
            free(in->liste_clients+t);
    L'erreur provient du free.
    Si tu le met en commentaire tu verra que ça fonctionne.
    Mais attention ! Si tu récrées un compte ensuite, il y aura alors un problème donc corrige cette erreur plutot que de la laisser en commentaires

    3) Fonction modifier_utilisateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            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_widget_show_all(pinfo); // RAJOUT
                gtk_dialog_run(GTK_DIALOG(pinfo));
                gtk_widget_destroy(pinfo);
            }
    Tu n'affiches pas la boite de dialogue à l'écran donc bon courage à l'utilisateur pour la trouver et cliquer dessus

    Si le nom existe déjà ton programme marche donc.



    Voilà, je n'ai pas eu le temps de tester exhaustivement tous les cas possibles d'utilisation de ton programme mais il semble fonctionner (les printf 1 2 et 3 fonctionnent en tout cas)

    Voili voilou bonne journée

  13. #13
    Membre régulier
    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
    Points : 117
    Points
    117
    Par défaut
    Merci pour ton aide Le free tu dis...
    hum... j'avais déjà eu des problèmes avec cette fonction en programmation système, j'aurais du m'en douter
    Toutefois, le problème est toujours là même si je mets le free en commentaires Le programme fini toujours par planter. Pourtant, le fait que je ne libère pas la mémoire devrait juste consommer quelques ko de plus dans la RAM, pas faire crasher le programme. Donc le problème doit venir d'ailleurs :s
    En plus, reste à savoir comment je vais faire pour libérer ma mémoire maintenant...
    Pour le reste, oui en effet j'ai quelques erreurs d'inattention, j'me suis empressé de les corriger

  14. #14
    Membre régulier
    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
    Points : 117
    Points
    117
    Par défaut
    Bon bah si quelqu'un d'autre a une idée, moi j'planche toujours

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Points : 116
    Points
    116
    Par défaut
    Liste moi toutes les erreurs que tu rencontres encore : quand, comment,...

    Parce qu'avec ce que j'ai corrigé, j'ai testé ton application et elle semble fonctionner. Donc possible que dans certains cas particuliers ca ne fonctionne pas encore, donc stp dis moi en détail ce qui ne marche pas encore.

  16. #16
    Membre régulier
    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
    Points : 117
    Points
    117
    Par défaut
    En fait, mettre le free en commentaires dans actualise_utilisateurs n'a strictement rien changé. Le programme continue de planter quand je veux créer ou modifier un utilisateur.

    Parfois ça plante dans actualise_utilisateur(), parfois ça plante dans creer_utilisateur(), c'est complètement instable. Et ce même si je mets un login et un mot de passe tout ce qu'il y a de plus banals et uniquement composés de lettres...

    J'ai envoyé mon programme à d'autres personnes et ils ont les mêmes bugs :-/

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Points : 116
    Points
    116
    Par défaut
    Je n'ai pas trop le temps de regarder là car je suis en projet mais dès que j'aurai le temps j'y jette un oeil.

    Tu dis que ca semble instable mais je n'y crois pas trop lol, il y a forcèment une logique derrière.

    Avec le code que tu m'a passé et les modifications que j'y ai apporté, ça plantait toujours de la même façon :

    - si j'ouvre l'application je me log avec Benji et mdp2 ok
    - je modifie un compte ok
    - je remodifie le compte => plantage

    Donc tu devrais essayer de voir la logique qui se cache derrière ces erreurs.
    Et ensuite lister les étapes de tous les cas d'utilisations ou ça plante.

  18. #18
    Membre régulier
    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
    Points : 117
    Points
    117
    Par défaut
    Pourtant après avoir appliqué tes modifications,
    moi voilà ce qui se passe :

    90% du temps :
    j'me log
    je crée ou modifie un utilisateur -> plantage

    10% du temps :
    j'me log
    je crée ou modifie un utilisateur -> ça marche
    je crée ou modifie un utilisateur à nouveau -> plantage

    autrement dit, aucun changement...

    C'est ça qui me perturbe autant, ça semble complètement aléatoire... Comme si le comportement de mon programme dépendait d'un espace mémoire non alloué...


    Mais le plus gros mystère est dans ce détail : Si je fais tourner mon programme avec gdb, il ne plante jamais !
    Mais si j'le fais tourner simplement sans debugger, il crashe inévitablement...

  19. #19
    Membre régulier
    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
    Points : 117
    Points
    117
    Par défaut
    J'ai corrigé quelques bugs que j'ai réussis à dénicher par-ci, par-là.
    Le comportement est un peu plus stable mais les plantages surviennent toujours...

    En fait, cette fois, je peux utiliser la fonction modifier_utilisateur des 10aines de fois sans que ça plante, mais dès que je crée un nouvel utilisateur, et que je réutilise la fonction modifier, alors ça plante...

    J'ai visiblement un problème avec la fonction creer_utilisateur, mais il est invisible...

  20. #20
    Membre régulier
    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
    Points : 117
    Points
    117
    Par défaut
    EUREKA !!
    Après des jours de relecture, j'ai enfin trouvé le bug ^^

    Comme je le pensais, j'écrivais dans une zone mémoire non-alouée, dans la fonction ajout_utilisateur.

    Un grand merci à tous ceux qui m'ont aidé ^^

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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