
28-03-2008, 22:30
|
 |
|
|
חבר מתאריך: 09.04.02
הודעות: 8,000
|
|
|
מצביעי void סוררים
אני כותב תוכנה מסויימת שמשתמשת ב-GTK וב-GLib.
ב-main יצרתי רשימה מקושרת (GList) והכנסתי אליה כמה אלמנטים לנסיון.
הגדרתי אירוע מסויים שאחראי על ציור תוכן לאובייקט GtkDrawingArea. כשהאירוע מתרחש,
נקראת פונקציה מסויימת (נקרא לה on_canvas_expose לצורך העניין) שמקבלת מצביע לאובייקט
ה-GtkDrawingArea שבו מתרחש האירוע, ומצביע void שאליו אני מעביר את המצביע לרשימה המקושרת.
כשאני מנסה להשתמש ברשימה המקושת מתוך ה-main אז אין שום בעיה, אבל בפונקציה
on_canvas_expose מתקבל מידע שגוי בעליל (או סתם כל מיני segmentation faults).
וכן, דאגתי לעשות את כל ה-casting הנחוץ 
הנה גרסה מקוצרת של החלקים הרלוונטיים בקוד:
קוד PHP:
/* main.c */
int main(...)
{
...
GList * list = NULL;
list = g_list_prepend(list, GINT_TO_POINTER(50));
list = g_list_prepend(list, GINT_TO_POINTER(35));
GtkWidget * canvas = gtk_drawing_area_new();
...
g_signal_connect(G_OBJECT(canvas), "expose_event", G_CALLBACK(on_canvas_expose), list);
...
}
/* Included from another file */
gboolean on_canvas_expose(GtkWidget * widget, gpointer data)
{
GList * list = (GList *) data;
cairo_t * cr = gdk_cairo_create(widget->window);
int radius = GPOINTER_TO_INT(list->next->data);
printf("Radius from the second node in the list: %d\n", radius);
// Testing testing :)
cairo_arc(cr, 100, 100, radius, 0, 2 * G_PI);
cairo_set_source_rgb(cr, 0, 0, 1);
cairo_fill_preserve(cr);
return TRUE;
}
הפלט:
ציטוט:
|
Radius from the first node in the list: 134607744
|
כמו שאתם רואים בפונקציה main, המספר שהיה אמור להתקבל הוא בכלל 50.
הצילו 
|