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 :

Gtk File Chooser, Erreur au Debogage.


Sujet :

GTK+ avec C & C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 4
    Par défaut Gtk File Chooser, Erreur au Debogage.
    Bonjour a tous, voila je suis en trin de réaliser un de mes projet qui était a l'état console, a l'état Fenêtre, pour cela j'utilise la bibliothèque Gtk, seulement voila, en général je trouve la cause des erreurs, mais la j'ai beau relire en boucle la partie du code qui pose problème je ne vois rien.

    Il ne s'agit pas d'une erreur de Syntaxe, ni de compilation, l'erreur surgit lors de l'exécution, c'est a dire pendant le Débogage.

    Voici l'erreur :

    Exception non gérée à 0x003717d6 dans project3.exe : 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x00000053.

    Et voici la fonction qui me pose 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
    void
    on_button2_clicked (GtkButton * button, gpointer data)
    {
    	FILE* cheminwow = NULL;
    	GtkWidget *pFileSelection;
            GtkWidget *pDialog;
    	GtkWidget *msgError;
    	GtkWidget *pParent;
            gchar* chemin;
     
     
    	pParent = GTK_WIDGET(data);
     
     
     
     
     
        /* Creation de la fenetre de selection */
            pFileSelection = gtk_file_chooser_dialog_new("Ouvrir...",
    	GTK_WINDOW(pParent),
    	GTK_FILE_CHOOSER_ACTION_OPEN,
    	GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
    	GTK_STOCK_OPEN, GTK_RESPONSE_OK,
    	NULL);
        /* On limite les actions a cette fenetre */
            gtk_window_set_modal(GTK_WINDOW(pFileSelection), TRUE);
     
        /* Affichage fenetre */
            switch(gtk_dialog_run(GTK_DIALOG(pFileSelection)))
            {
                case GTK_RESPONSE_OK:
                /* Recuperation du chemin */
                chemin = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection));
                pDialog = gtk_message_dialog_new(GTK_WINDOW(pFileSelection),
                    GTK_DIALOG_MODAL,
                    GTK_MESSAGE_INFO,
                    GTK_BUTTONS_OK,
                    "Chemin du fichier :\n%s", chemin);
    			gtk_dialog_run(GTK_DIALOG(pDialog));
    			gtk_widget_destroy(pDialog);
     
     
     
     
    				cheminwow = fopen("cheminwow.txt", "w+");
     
    				if(cheminwow != NULL)
    					{
    						fputs(chemin, cheminwow);
    						fclose(cheminwow);
     
    					}
    				else
    					{
    						msgError =  gtk_message_dialog_new (NULL,
    							   GTK_DIALOG_MODAL,
    							   GTK_MESSAGE_ERROR,
    							   GTK_BUTTONS_OK,
    							   "Impossible de creer un fichier Cheminwow.txt contenant l'adresse du realmlist !");
    						gtk_window_set_title (GTK_DIALOG (msgError), _("Erreur !"));
    						gtk_dialog_run(GTK_DIALOG(msgError));
    						gtk_widget_destroy(msgError);	
    					}
     
     
    						break;
    					default:
     
    						break;
        }
     
    	g_free(chemin);
    	gtk_widget_destroy(pFileSelection);
     
    }
    Mon programme me créer bien un Fichier "cheminwow.txt" avec l'adresse choisi par l'utilisateur dans la boite de dialogue de sélection, pourtant après l'erreur se lance.
    En Activant le mode console qui permet de voir des erreur envoyer par Gtk, j'obtiens ceci lorsque j'exécute cette fonction :



    Edit 1: Je viens de me rendre compte que si je clique sur Open, Comme sur Annulé ( Donc le cas Default ), le message d'erreur survient, je n'y comprend vraiment plus rien, merci pour la futur âme qui me viendras en aide !

    Edit 2: Je me suis apercu que si l'utilisateur ne validais pas je faisais quand meme g_free(); sur un pointeur non-initialisé donc j'ai corrigé en le métant dans le case OK, pourtant la meme erreur de deboger survient.


    Merci pour vos réponses.

  2. #2
    Membre confirmé Avatar de Gamall
    Profil pro
    Étudiant ENSEA
    Inscrit en
    Août 2009
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant ENSEA

    Informations forums :
    Inscription : Août 2009
    Messages : 252
    Par défaut
    Salut,
    J'ai fais des tests avec ce code:
    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
     
    #include <gtk/gtk.h>
    #include <stdlib.h>
     
    void
    on_button2_clicked (GtkButton * button, gpointer data)
    {
      FILE *cheminwow = NULL;
      GtkWidget *pFileSelection;
      GtkWidget *pDialog;
      GtkWidget *msgError;
      GtkWidget *pParent;
      gchar *chemin;
     
      pParent = GTK_WIDGET (data);
     
      /* Creation de la fenetre de selection */
      pFileSelection = 
               gtk_file_chooser_dialog_new ("Ouvrir...",
    					GTK_WINDOW (pParent),
    					GTK_FILE_CHOOSER_ACTION_OPEN,
    					GTK_STOCK_CANCEL,
    					GTK_RESPONSE_CANCEL,
    					GTK_STOCK_OPEN,
    					GTK_RESPONSE_OK, NULL);
     
    /* On limite les actions a cette fenetre */
      gtk_window_set_modal (GTK_WINDOW (pFileSelection), TRUE);
     
      /* Affichage fenetre */
      switch (gtk_dialog_run (GTK_DIALOG (pFileSelection)))
        {
        case GTK_RESPONSE_OK:
          /* Recuperation du chemin */
          chemin =
    	    gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (pFileSelection));
     
          pDialog =
    	    gtk_message_dialog_new (GTK_WINDOW (pFileSelection), GTK_DIALOG_MODAL,
    				GTK_MESSAGE_INFO, GTK_BUTTONS_OK,
    				"Chemin du fichier :\n%s", chemin);
     
          gtk_dialog_run (GTK_DIALOG (pDialog));
          gtk_widget_destroy (pDialog);
     
          cheminwow = fopen ("cheminwow.txt", "w+");
     
          if (cheminwow != NULL)
    	{
    	  fputs (chemin, cheminwow);
    	  fclose (cheminwow)
    	}
          else
    	{
    	  msgError = 
                    gtk_message_dialog_new (NULL,
    				     GTK_DIALOG_MODAL,
    				     GTK_MESSAGE_ERROR,
    				     GTK_BUTTONS_OK,
    				     "Impossible de creer un fichier"
    				     " Cheminwow.txt contenant l'adresse"
    				     " du realmlist !");
     
              gtk_window_set_title (GTK_WINDOW (msgError), "Erreur !");
    	  gtk_dialog_run (GTK_DIALOG (msgError));
    	  gtk_widget_destroy (msgError);
    	}
          break;
     
        default:
          break;
        }
     
      gtk_widget_destroy (pFileSelection);
     
      /* Le probleme survient lorsque l'on libere cette chaine */
      g_free (chemin);
     
    }
     
    int
    main (int argc, char **argv)
    {
      GtkWidget *pWindow = NULL;
      GtkWidget *pButton = NULL;
     
      gtk_init (&argc, &argv);
     
      pWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
      gtk_window_set_default_size (GTK_WINDOW (pWindow), 320, 200);
      g_signal_connect (G_OBJECT (pWindow), "destroy", G_CALLBACK (gtk_main_quit),
    		    NULL);
     
      pButton = gtk_button_new_with_label ("toto");
      gtk_container_add (GTK_CONTAINER (pWindow), pButton);
     
      g_signal_connect (G_OBJECT (pButton), "clicked",
    		    G_CALLBACK (on_button2_clicked), pWindow);
     
      gtk_widget_show_all (pWindow);
     
      gtk_main ();
      return EXIT_SUCCESS;
    }
    Le problème semble venir ligne 81, lorsque tu libère la chaine "chemin"

    Par contre, la façon dont ton code est indenté, le rend très peu lisible

  3. #3
    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 t'as un debugger qui tourne au moment où ton programme échoue, il devrait au moins te donner des infos sur la ligne exacte qui pose des pbs.

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 315
    Billets dans le blog
    5
    Par défaut
    Le g_free(chemin); ne peut fonctionner que si chemin est initialisé. Il y a un cas où chemin n'est jamais initialisé. Donc problème.

    La bonne méthode est déjà de toujours mettre un pointeur à NULL lorsqu'on le déclare. Ainsi un g_free(NULL); ne posera jamais de soucis lors de son exécution.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 4
    Par défaut
    Merci pour vos réponses, je suis finalement passé par FileSelection et mon programme est en phase de Release, J'essayerais a nouveau FileChooser, lorsque j'aurais réinstallé Gtk+, car en effet je me suis rendu compte que Le Linkage des Dll, Gtk au niveau de VS etait pas les bonnes, Glade indiquait certaines Libs, et VS etait relié a d'autres libs de Gtk, peut être des plus anciennes, bref merci a vous.

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

Discussions similaires

  1. file chooser en boite de dialogue?
    Par john123 dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 16/07/2007, 13h45
  2. Cherche un File Chooser
    Par mardona dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/06/2007, 12h52
  3. File chooser: Filtrage des lecteurs
    Par kisitomomotene dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 08/03/2007, 15h19
  4. erreur privileges debogage
    Par jemafo dans le forum Windows XP
    Réponses: 3
    Dernier message: 26/02/2007, 19h37
  5. J File Chooser
    Par ecthelion dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 08/05/2006, 13h04

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