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 :

Callback qui change des pointeurs


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 25
    Par défaut Callback qui change des pointeurs
    Bonjour,

    J'utilise GTK+3 pour faire une application graphique. À un moment donné je souhaite connecter à un menuItem une fonction qui a besoin deux arguments (un GtkTreeStore, et une structure que j'ai créé). J'ai donc créé une structure et je lui donne des pointeurs sur le deux objets dont j'ai besoin. Seulement, quand je récupère les pointeurs dans ma fonction, ils ont changé, et je ne comprend pas pourquoi.
    Je vous met les parties de mon code qui posent problème.

    La fonction appelante
    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
    GtkWidget* menuMake (GtkWidget* mainWindow, save* truc, GtkTreeStore* store) {
    	GtkWidget* menuBar;
    	GtkWidget* file;
    	GtkWidget* menuFile;
    	GtkWidget* new;
    	GtkWidget* importFolder;
    	GtkWidget* open;
    	GtkWidget* quit;
    	GtkAccelGroup* accel_group;
    	importMovie* import;
    //	import=malloc (sizeof(importMovie));
    	import->save=truc;
    	import->store=store;
    	
    g_print ("adresse de import dans menuMake : %p\n", &import);
    g_print ("adresse de save dans menuMake : %p\n", truc);
    g_print ("adresse de import->save dans menuMake : %p\n", import->save);
    	/*** Début : création des racourcis clavier ***/
    	accel_group=gtk_accel_group_new();
    	accelerator_new (accel_group, "<Control>O", ACCEL_PATH_OPEN, G_CALLBACK(openFile), NULL);
    	accelerator_new (accel_group, "<Control>I", ACCEL_PATH_IMPORT, G_CALLBACK(openFolder), import); // CE CALLBACK LÀ
    	accelerator_new (accel_group, "<Control>Q", ACCEL_PATH_QUIT, G_CALLBACK(gtk_main_quit), NULL);
    	// Ajout des racoucis clavier dans la fenêtre principale
    	gtk_window_add_accel_group (GTK_WINDOW(mainWindow), accel_group);
    	/*** Fin : création des racourcis clavier ***/
    	
    	
    	// création de la barre de menu
    	menuBar=gtk_menu_bar_new();
    	
    	/*** Début : création du menu fichier ***/
    	MENU_NEW(menuFile, accel_group);
    	
    	MENU_IMAGE_ITEM(menuFile, new, NEW);
    	MENU_IMAGE_ITEM(menuFile, open, OPEN);
    	g_signal_connect (G_OBJECT(open), "activate", G_CALLBACK(openFile), NULL);
    	gtk_menu_item_set_accel_path (GTK_MENU_ITEM(open), ACCEL_PATH_OPEN);
    	MENU_ITEM(menuFile, importFolder, "_Importer");
    	g_signal_connect (G_OBJECT(importFolder), "activate", G_CALLBACK(openFolder), import); // CE CALLBACK LÀ
    	gtk_menu_item_set_accel_path (GTK_MENU_ITEM(importFolder), ACCEL_PATH_IMPORT);
    …
    La fonction appelé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void openFolder (GtkMenuItem* item, gpointer data) {
    	char* folderName;
    	GtkWidget* fileDialog;
    	importMovie* machin= (importMovie*)data;
    	save* truc = machin->save;
    	GtkTreeStore* store= machin->store;
    	list* list=NULL;
     
    g_print ("adresse de data dans open : %p\n", data);
    g_print ("adresse de machin dans open : %p\n", machin);
    g_print ("adresse de machin->save dans open : %p\n", machin->save);
    g_print ("adresse de save dans open : %p\n", truc);
    …
    La structure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct importMovie importMovie;
    struct importMovie {
    	struct save* save;
    	GtkTreeStore* store;
    };
    Et le résultat affiché dans le terminal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    adresse de import dans menuMake : 0x7fffbacfc2f8
    adresse de save dans menuMake : 0x78f750
    adresse de import->save dans menuMake : 0x78f750
    adresse de data dans open : 0x8151c0
    adresse de machin dans open : 0x8151c0
    adresse de machin->save dans open : 0x7bdc00
    adresse de save dans open : 0x7bdc00
    Petite précision, l'adresse de save au début de la fonction menuMake (0x78f750) est la même que celle de save au tout début du programme lorsque de je créé la variable.

    Pour réglé le problème problème j'ai essayé de faire une structure qui prend des pointeurs de pointeurs, j'ai essayé de mettre la structure import en variable "normale" est de donner son adresse au callback, j'essayé de la mettre en pointeur et de donner son adresse,… Mais rien n'y fait et je n'ai pas d'idée de comment résoudre ce problème !

    Donc si une (ou plusieurs) âme(s) charitable passe dans le coin, peut-elle m'aider ?

    Cordialement,

    Phantom

  2. #2
    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
    Par défaut
    Bnonjour,

    c'est normal que la ligne 11 soit commentée ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    import=malloc (sizeof(importMovie));
    Parce que ça devrait juste après normalement.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 25
    Par défaut
    C'est que j'ai oublié de décommentée quand je suis repassé aux pointeurs, mais ça ne change rien.

    Comme ma structure save est unique et commune à l'ensemble du programme je l'ai passé en variable globale, mais ça ne résout qu'une partie du problème.
    Je remet le code modifié.
    Fonction appelante
    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
    GtkWidget* menuMake (GtkWidget* mainWindow, GtkTreeStore* store) {
    	GtkWidget* menuBar;
    	GtkWidget* file;
    	GtkWidget* menuFile;
    	GtkWidget* new;
    	GtkWidget* importFolder;
    	GtkWidget* open;
    	GtkWidget* quit;
    	GtkAccelGroup* accel_group;
    	
    g_print ("L'adresse de store dans menuMake est : %p\n", store);
    	
    	/*** Début : création des racourcis clavier ***/
    	accel_group=gtk_accel_group_new();
    	accelerator_new (accel_group, "<Control>O", ACCEL_PATH_OPEN, G_CALLBACK(openFile), NULL);
    	accelerator_new (accel_group, "<Control>I", ACCEL_PATH_IMPORT, G_CALLBACK(openFolder), store); //CE CALLBACK LÀ
    	accelerator_new (accel_group, "<Control>Q", ACCEL_PATH_QUIT, G_CALLBACK(gtk_main_quit), NULL);
    	// Ajout des racoucis clavier dans la fenêtre principale
    	gtk_window_add_accel_group (GTK_WINDOW(mainWindow), accel_group);
    	/*** Fin : création des racourcis clavier ***/
    	
    	
    	// création de la barre de menu
    	menuBar=gtk_menu_bar_new();
    	
    	/*** Début : création du menu fichier ***/
    	MENU_NEW(menuFile, accel_group);
    	
    	MENU_IMAGE_ITEM(menuFile, new, NEW);
    	MENU_IMAGE_ITEM(menuFile, open, OPEN);
    	g_signal_connect (G_OBJECT(open), "activate", G_CALLBACK(openFile), NULL);
    	gtk_menu_item_set_accel_path (GTK_MENU_ITEM(open), ACCEL_PATH_OPEN);
    	MENU_ITEM(menuFile, importFolder, "_Importer");
    	g_signal_connect (G_OBJECT(importFolder), "activate", G_CALLBACK(openFolder), store); //CE CALLBACK LÀ
    	gtk_menu_item_set_accel_path (GTK_MENU_ITEM(importFolder), ACCEL_PATH_IMPORT);
    La fonction appelé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void openFolder (GtkMenuItem* item, gpointer data) {
    	char* folderName;
    	GtkWidget* fileDialog;
    	GtkTreeStore* store= data;
    	list* list=NULL;
     
    g_print ("adresse de data dans open : %p\n", data);
    g_print ("L'adresse de store dans open est : %p\n", store);
    Et l'affichage dans le terminal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    L'adresse de store dans make_tree est : 0x129ef20 (création de l'objet)
    L'adresse de store dans menuMake est : 0x129ef20
    adresse de data dans open : 0x128e170
    L'adresse de store dans open est : 0x128e170
    Donc comme on peut le constater, l'adresse change durant le callback. Comment faire pour que ça ne change pas ?

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 25
    Par défaut
    Le problème viens du fait que pour les callback des raccourcis claviers il faut une fonction différente, j'ai donc résolut le problème en ajoutant la fonction si-dessous et en l'appelant dans la création du raccourcis.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    gboolean accel_import (GtkAccelGroup *accel_group, GObject *acceleratable, guint keyval, GdkModifierType modifier, gpointer user_data) {
    	openFolder (NULL, user_data);
    	return TRUE;
    }
    Donc je passe le sujet en résolut.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/05/2011, 12h46
  2. [Joomla!] des zone d'image clicable qui change de couleur
    Par heeedi dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 07/01/2010, 09h38
  3. Comment faire un DROP sur des tables qui change de nom ?
    Par GeantBioHazard dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 04/07/2008, 15h03
  4. Toolbar qui change les actions des clics
    Par TheDrev dans le forum Windows
    Réponses: 2
    Dernier message: 23/10/2007, 11h02
  5. position des colonnes du datagriedview qui change
    Par el_pilacho dans le forum VB.NET
    Réponses: 4
    Dernier message: 10/04/2007, 12h23

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