我在使用g_timeout_add
时遇到问题。我正在调用的函数是:
gboolean time_handler(GtkWidget *widget, GtkWidget *sum) {
if (widget == NULL) return FALSE;
gchar *display;
display = g_strdup_printf("%d", globalCounter); //convert num to str
gtk_label_set_text (GTK_LABEL(sum), display); //set label to "display"
g_free(display);
return TRUE;
}
主要...
g_timeout_add(1000, (GSourceFunc) time_handler, (window, sum))
这是我得到的警告:
gtkp2.c:66:60: warning: left-hand operand of comma expression has no effect [-Wunused-value]
g_timeout_add(1000, (GSourceFunc) time_handler, (window,sum));
在运行程序时出现分段错误。
让我们看一下g_timeout_add和GSourceFunc的手册。
我们看到了:
gboolean
(*GSourceFunc) (gpointer user_data);
和
guint
g_timeout_add (guint interval,
GSourceFunc function,
gpointer data);
这意味着您的代码中有2个基本错误:
gboolean time_handler(GtkWidget *widget, GtkWidget *sum)
GSourceFunc
的定义,因为它只能接受1个单个参数。编译器可能已告知您有关此错误的信息,因为您已将代码强制转换为正确的类型。如果使用正确的类型,则不需要强制类型转换。如果GTK没有将2个参数传递给您的函数(它应该如何知道无效的函数签名?),但是您访问该参数并尝试将其作为指针取消引用,则会调用未定义的行为,此行为表现为分段错误。情况。
如果要传递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.