2015-04-28 69 views
0

我试图将一个值传递给g_timeout_add_seconds()中使用的函数,但它不像预期的那样工作。它正常工作时,我将一个值传递给函数。我是否错误地使用了g_timeout_add_seconds()?将值传递给g_timeout_add_seconds()不起作用?

typedef struct { int x, y; } xy_t; 

void fn_init(void) 
{ 
    xy_t xy; 
    int z; 

    xy.x = 12; 
    xy.y = 23; 
    z = 123; 
    pass_thru_test1(&xy); 
    pass_thru_test2(&xy); 
    pass_thru_test3(&z); 

    z = 234; 
    g_timeout_add_seconds(1, pass_thru_test3, &z); 
} 

gboolean pass_thru_test1(xy_t *data) 
{ 
    xy_t *point = (xy_t *)data; 
    printf("Pass Thru Test 1: x:%d, y:%d\n", point->x, point->y); 
    return TRUE; 
} 

gboolean pass_thru_test2(gpointer data) 
{ 
    xy_t *p = (xy_t *)data; 
    printf("Pass Thru Test 2: x:%d, y:%d\n", p->x, p->y); 
    return TRUE; 
} 

gboolean pass_thru_test3(gpointer data) 
{ 
    int *point = (int *)data; 
    printf("Pass Thru Test 3: %d\n", *p); 
    return TRUE; 
} 

结果是:

Pass Thru Test 1: x:12, y:23 
Pass Thru Test 2: x:12, y:23 
Pass Thru Test 3: 123 
Pass Thru Test 3: 724126128 
Pass Thru Test 3: 724126128 
Pass Thru Test 3: 724126128 

回答

0

的问题是,您要发送一个指向一个局部变量的数据参数。

void fn_init(void) 
{ 
    xy_t xy; 
    int z; /* this varible is local */ 

    xy.x = 12; 
    xy.y = 23; 
    z = 123; 
    pass_thru_test1(&xy); 
    pass_thru_test2(&xy); 
    pass_thru_test3(&z); 

    z = 234; 
    g_timeout_add_seconds(1, pass_thru_test3, &z); 
} 

变量生活的fn_init()堆栈帧,当你访问它pass_through*函数中,它已经被释放,因为fn_init()返回调用g_timeout_add_secons()之后。

当你完成它的工作后,请不要忘记free(z)

gboolean pass_thru_test3(gpointer data) 
{ 
    int *point; 
    point = (int *)data; 
    if (point == NULL) 
     return FALSE; 
    printf("Pass Thru Test 3: %d\n", *point); 
    free(data); 
    return TRUE; 
} 

有两种可能的解决方案,这取决于你的函数是真的要去做,使用malloc()

void fn_init(void) 
{ 
    xy_t xy; 
    int *z; 

    xy.x = 12; 
    xy.y = 23; 

    z = malloc(sizeof(*z)); 
    if (z == NULL) 
    return; 
    *z = 123; 

    pass_thru_test1(&xy); 
    pass_thru_test2(&xy); 
    pass_thru_test3(z); 

    *z = 234; 
    g_timeout_add_seconds(1, pass_thru_test3, z); 
} 

您也可以z静态的,但那么这将是相同的z每次你可以调用fn_init(),并且修改是通过函数调用保存的。

+0

这只是一个int,所以GPOINTER_TO_INT和GINT_TO_POINTER也是一个选项。 – nemequ

相关问题