Récupérer les élements d'une structure ...
Bonjour,
J'ai créé une structure, dont j'alloue dynamiquement un pointeur.
Cette structure, je la place dans une GList, mais apres, je n'arrive pas à acceder à un élement de mon pointeur (qui est la structure mentionnée plus haut) à partir de la GList !
Bon, grossièrement :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| typedef struct
{
GtkWidget *p_tab_label;
GtkWidget *p_scrollbar;
GtkWidget *p_scrollbar_2;
GtkWidget *p_text_view;
GtkWidget *p_list_view;
GtkListStore *p_list_store;
GtkTreeViewColumn *p_column;
GtkCellRenderer *p_renderer;
GtkWidget *p_hpaned;
}
_tab_chan_s;
_tab_chan_s *p_tab_chan_s; |
Je vous passe l'allocation en memoire :wink:
Voici ma fonction (qui n'est pas finie):
Code:
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
| void cb_send_message (GtkWidget *p_widget, gpointer p_data)
{
const gchar *p_msg = NULL;
gint current_page = 0;
GtkTextBuffer *p_buffer = NULL;
GtkTextIter i_end;
gpointer p_st_data = NULL;
/* Recupere le texte contenu dans la zone de saisie */
p_msg = gtk_entry_get_text (GTK_ENTRY (main_win_s->p_entry));
/* Si le tampon est vide alors la zone est vide. Affichage d'un
message d'information */
if (strcmp (p_msg, EMPTY_LINE) == 0)
{
dlg_show_message (
GTK_WINDOW (main_win_s->p_window),
GTK_MESSAGE_INFO,
GTK_BUTTONS_OK,
"La zone de saisie est vide !");
}
else
{
/* Recupere la page courrante */
current_page = gtk_notebook_get_current_page (
GTK_NOTEBOOK (main_win_s->p_notebook));
p_st_data = g_list_nth_data (p_tab_chan_list, current_page);
p_buffer = gtk_text_view_get_buffer ((_tab_chan_s)p_st_data->p_text_view);
}
} |
mais je n'arrive pas a acceder aux widgets contenu dans ma structure ajoutée ainsi dans la GList:
Code:
g_list_append (p_tab_chan_list, p_tab_chan_s);
J'ai ceci en message d'erreur:
Citation:
107 C:\Documents and Settings\CSoldier\Mes documents\Sauvegardes\Programmation\MOPIC\mopic_callback.c [Warning] dereferencing `void *' pointer
107 C:\Documents and Settings\CSoldier\Mes documents\Sauvegardes\Programmation\MOPIC\mopic_callback.c request for member `p_text_view' in something not a structure or union
Voilà toute l'histoire, si quelqu'un pouvait me mettre sur la voie ce serait super !
Merci d'avance :P
Re: [GTK] Récupérer les élements d'une structure ...
Citation:
Envoyé par CSoldier
Code:
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
| void cb_send_message (GtkWidget *p_widget, gpointer p_data)
{
const gchar *p_msg = NULL;
gint current_page = 0;
GtkTextBuffer *p_buffer = NULL;
GtkTextIter i_end;
gpointer p_st_data = NULL;
/* Recupere le texte contenu dans la zone de saisie */
p_msg = gtk_entry_get_text (GTK_ENTRY (main_win_s->p_entry));
/* Si le tampon est vide alors la zone est vide. Affichage d'un
message d'information */
if (strcmp (p_msg, EMPTY_LINE) == 0)
{
dlg_show_message (
GTK_WINDOW (main_win_s->p_window),
GTK_MESSAGE_INFO,
GTK_BUTTONS_OK,
"La zone de saisie est vide !");
}
else
{
/* Recupere la page courrante */
current_page = gtk_notebook_get_current_page (
GTK_NOTEBOOK (main_win_s->p_notebook));
p_st_data = g_list_nth_data (p_tab_chan_list, current_page);
p_buffer = gtk_text_view_get_buffer ((_tab_chan_s)p_st_data->p_text_view);
}
} |
mais je n'arrive pas a acceder aux widgets contenu dans ma structure ajoutée ainsi dans la GList:
Code:
g_list_append (p_tab_chan_list, p_tab_chan_s);
J'ai ceci en message d'erreur:
Citation:
107 C:\Documents and Settings\CSoldier\Mes documents\Sauvegardes\Programmation\MOPIC\mopic_callback.c [Warning] dereferencing `void *' pointer
107 C:\Documents and Settings\CSoldier\Mes documents\Sauvegardes\Programmation\MOPIC\mopic_callback.c request for member `p_text_view' in something not a structure or union
Voilà toute l'histoire, si quelqu'un pouvait me mettre sur la voie ce serait super !
Le principe général pour récupérer des données à partir d'un pointeur anonyme (pour cause de callback, par exemple...) est de caster dans le bon type ou d'utiliser un pointeur local du bon type.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
void f (void *p)
{
printf ("n = %d\n", *((int*)p)); /* horrible! */
/* ou */
int *pi = p;
if (pi != NULL)
{
printf ("n = %d\n", *pi);
}
} |
Evidemment c'est au programmeur de savoir le type de la variable dont il a passé l'adresse à la fonction qui appellera un jour le callback. C'est du 'sans filet', et il vaut mieux être réveillé.
Détails sur les callbacks avec variable anonyme ici :
http://emmanuel-delahaye.developpez.com/complog.htm
(GTK est un exemple parfait de composant logiciel).