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