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 :

Segmentation Fault lors de mise à jour d'image par callback


Sujet :

GTK+ avec C & C++

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Segmentation Fault lors de mise à jour d'image par callback
    Bonsoir,

    Ca fait quelques jours que je tente de résoudre un problème sur mon programme. J'ai un segmentation fault au niveau du gtk_image_set_from_file(j'ai vérifié la ligne avec Valgrind) de la fonction Onclick lorsqu'elle est appelée par un clic de souris.

    Je pense que c'est un problème d'allocation mémoire mais rien n'y fait. Voici le programme en question :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <gtk/gtk.h>
     
     
    void Onclick(GtkWidget* Event, gpointer Data);
     
     
    int main(int argc, char *argv[])
    {
    	GtkWidget* ptrMainWindow;
    	GtkWidget* table;
    	GtkWidget* image_case;
    	GtkWidget* EventBox;
    	gint height, width;
    	gdouble ratio;  
     
    	gtk_init(&argc, &argv);
     
    	ptrMainWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
     
    	GdkScreen* ecran = gtk_window_get_screen(GTK_WINDOW(ptrMainWindow));
    	ratio = 1/2;
    	height = gdk_screen_get_height(ecran);
    	width = gdk_screen_get_width(ecran);
     
    	gtk_window_set_title(GTK_WINDOW(ptrMainWindow), "Echec au 8 !");
    	gtk_window_set_position(GTK_WINDOW(ptrMainWindow), GTK_WIN_POS_CENTER);
    	gtk_window_set_default_size(GTK_WINDOW(ptrMainWindow), width/2, height-150);
     
    	table = gtk_table_new(1, 1, TRUE);
    	gtk_table_set_row_spacings(GTK_TABLE(table), 0);
      	gtk_table_set_col_spacings(GTK_TABLE(table), 0);
     
     
       	image_case = gtk_image_new_from_file ("./images/caseB_pion4.png");
     
        	EventBox = gtk_event_box_new ();
     
       	gtk_container_add (GTK_CONTAINER (EventBox), image_case);
        	g_signal_connect (G_OBJECT (EventBox), "button-press-event", G_CALLBACK (Onclick), &image_case);
     
       	gtk_table_attach_defaults(GTK_TABLE(table), EventBox, 0, 1, 0, 1);
     
     
     
    	gtk_container_add(GTK_CONTAINER(ptrMainWindow), table);
     
    	gtk_widget_show_all(ptrMainWindow);
     
    	g_signal_connect(G_OBJECT(ptrMainWindow), "destroy", G_CALLBACK(gtk_exit), NULL);
     
    	gtk_main();
     
    	return EXIT_SUCCESS;
    }
     
     
    void Onclick(GtkWidget* Event, gpointer Data)
    {
     
    	GtkWidget* image;
    	image = (GtkWidget*)Data;
     
    	gtk_image_set_from_file(GTK_IMAGE(image), "./images/caseN.png");
     
    }
    Merci par avance.

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 296
    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 296
    Points : 4 949
    Points
    4 949
    Billets dans le blog
    5
    Par défaut
    Ha les pointeurs! Une vraie prise de tête

    Alors, deux problèmes ici.

    Tout d'abord tu envoies l'adresse contenant l'adresse de l'image à changer. Je n'en vois pas bien l'utilité d'autant que dans le CallBack tu fais comme si c'était directement le pointeur image. Donc commences par transmettre simplement le pointeur, et non l'adresse du pointeur.

    Ensuite il est très important de respecter les prototypes des Callback liés aux signaux sous peine de se taper la tête contre les murs pendant un bon moment. Le prototype attaché au signal "button-press-event" est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gboolean user_function (GtkWidget* widget, GdkEventButton *event,  gpointer user_data)

  3. #3
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Encore une fois g3rald tu me sauves

    Pourtant ce n'est pas faute d'avoir cherché pendant de longues heures.
    Cependant, je ne savais pas que chaque événement avait sa propre syntaxe pour la fonction de callback; je m'en souviendrai avant de me taper la tête contre les murs

    Aurais tu un bon ouvrage à me conseiller ou un bon site sur GTK+(anglais ou français) ?

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 296
    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 296
    Points : 4 949
    Points
    4 949
    Billets dans le blog
    5
    Par défaut
    Malheureusement le seul livre Gtk+ édité en français est vraiment obsolète. Donc d'aucune utilité.
    Pour le reste la documentation officielle, même si elle ne foisonne pas d'exemple est pour ainsi dire la seule source fiable d'information. J'ajouterai bien sur ce formidable forum (ainsi que tous les autres bien sûr )

    Sous linux il y une application, DevHelp qui permet d'intégrer les documentations et ainsi de pouvoir les consulter en temps réels. Ca aide vraiment. Si tu es sous Windows je te conseille fortement de télécharger la documentation pour l'avoir sous la main en permanence.

    Cette documentation te permet, à partir d'un Widget de connaitre les signaux attachés. Il te suffit alors de cliquer sur le signal intéressé pour voir le prototype de CallBack associé. Un jeu d'enfant je vous dit

  5. #5
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Je suis sous Ubuntu donc je vais voir ce fameux Devhelp qui m'a l'air fort interessant.

    Merci du conseil

  6. #6
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 296
    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 296
    Points : 4 949
    Points
    4 949
    Billets dans le blog
    5
    Par défaut
    Donc tu installes DevHelp puis les docs associées aux différentes librairies Glib, Gtk, GdkPixbuf, Cairo...
    Ensuite si tu utilises Gedit comme éditeur de texte il existe un plugins qui te permet d'accéder directement à la documentation de devhelp depuis l'éditeur. Un vrai bonheur.
    Par exemple tu commences à ecrire "gtk_widget_set", tu appuies sur la touche "F2" et devhelp se lance et t'affiche une recherche sur les fonctions commencant par ces quelques mots.
    J'arrête là le descriptif. Il existe bien d'autres plugns pour gedit mais ce n'est pas le sujet ici .

  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
    Points : 2 002
    Points
    2 002
    Par défaut
    Citation Envoyé par bboy_keen Voir le message
    Cependant, je ne savais pas que chaque événement avait sa propre syntaxe pour la fonction de callback; je m'en souviendrai avant de me taper la tête contre les murs
    Elle est indiquée dans la doc du signal en question:
    http://library.gnome.org/devel/gtk/s...on-press-event

    La technique: chaque page de doc d'un objet est séparée en sections. Tu as des liens en haut de page vers ces sections. Quand pour un objet donné, tu cherches le prototype d'un signal, il faut trouver quelle classe fournit ce signal. Tu dois donc procéder ainsi.

    Aller dans la section "Signals", qui liste les signaux disponible pour cette classe. GtkEventBox n'en a pas, il faut donc rechercher dans les classes parentes. Tu va donc dans la section "Object Hierarchy" de la page, cela te permet de remonter rapidement à la classe mère.

    Tu répètes l'opération jusqu'à ce que tu trouves la classe qui gère ton signal. Tu trouveras en cliquant sur le nom du signal le prototype de callback à utiliser.

  8. #8
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Ok, je prends note de tout ça

    Merci!

Discussions similaires

  1. erreur "Segmentation Fault" lors de l'import d'un dump
    Par farenheiit dans le forum Import/Export
    Réponses: 13
    Dernier message: 28/11/2007, 10h17
  2. PB segmentation fault lors d'installation RPM
    Par Asce_ dans le forum RedHat / CentOS / Fedora
    Réponses: 3
    Dernier message: 06/11/2007, 11h22
  3. Mise à jour d'image par un ListBox
    Par Definol dans le forum ASP.NET
    Réponses: 2
    Dernier message: 31/07/2007, 13h51
  4. [MySQL] contenu champs de table effacé lors de mise à jour de donnée
    Par gregos13 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 06/04/2006, 17h18
  5. message d'erreur lors de mise à jour d'une BD access
    Par Abydos Business Group dans le forum Access
    Réponses: 2
    Dernier message: 25/01/2006, 16h36

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