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
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
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 structure
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);
Et le résultat affiché dans le terminal
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; };
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.
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
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
Partager