Давайте посмотрим на руководство для g_timeout_add и GSourceFun c.
Там мы видим:
gboolean
(*GSourceFunc) (gpointer user_data);
и
guint
g_timeout_add (guint interval,
GSourceFunc function,
gpointer data);
Это означает, что в вашем коде есть 2 базовых c ошибки:
gboolean time_handler(GtkWidget *widget, GtkWidget *sum)
- Ваша функция не соответствует определению
GSourceFunc
, поскольку она только разрешено принимать 1 единственный параметр. Компилятор, вероятно, сообщил вам об этой ошибке, потому что в вашем коде приведен правильный тип. Если вы используете правильный тип, преобразование не требуется.
Если GTK не передает 2 параметра вашей функции (как она должна знать о вашей недопустимой сигнатуре функции?), Но вы получаете доступ к этому параметру и попытайтесь разыменовать его как указатель, вы вызываете неопределенное поведение, которое в этом случае проявляется как ошибка сегментации.
Вы пытаетесь передать указатели
2 через параметр
1 . Как сказал вам компилятор, левый операнд вообще не имеет никакого эффекта.
Если вы хотите передать 2 значения, вам нужно определить структуру и передать указатель на такую структуру:
typedef struct{
GtkWidget *widget,
GtkWidget *sum
} myParameters;
gboolean time_handler(gpointer *par) {
myParams *params = par;
...
}
...
myParams param = {widget, sum};
g_timeout_add(1000, time_handler, ¶ms);
// Make sure that lifetime of params does not end before your handler might be called! Local variables in main are OK for this.