2009-12-11 53 views
0

为什么我在回调中没有正确识别?将int传递给C回调

我认为,也许是因为在add_strip()“我”被销毁后,我怎么可以传递一个int到那个回调?谢谢。

29 void add_strip(int i,char name[30]){ 
30  sl[i] = elm_slider_add(win); 
31  elm_slider_label_set(sl[i], name); 
32  elm_slider_unit_format_set(sl[i], "dB"); 
33  elm_slider_span_size_set(sl[i], 60); 
34  evas_object_size_hint_align_set(sl[i], 0.5, EVAS_HINT_FILL); 
35  evas_object_size_hint_weight_set(sl[i], 0.0, EVAS_HINT_EXPAND); 
36  elm_slider_indicator_format_set(sl[i], "%3.0f"); 
37  elm_slider_min_max_set(sl[i], 0, 2); 
38  elm_slider_inverted_set(sl[i], 1); 
39  elm_slider_value_set(sl[i], 0); 
40  elm_object_scale_set(sl[i], 1.0); 
41  elm_slider_horizontal_set(sl[i], 0); 
42  elm_box_pack_end(bx, sl[i]); 
43  evas_object_show(sl[i]); 
44  evas_object_smart_callback_add(sl[i], "changed", vol_changed, &i); // <-------------- 
45 } 

而且回调:

13 static void 
14 vol_changed(void *data, Evas_Object *obj, void *event_info) 
15 { 
16  int n = *((int*)data); 
17  printf("%d\n", &n); // <------------------------------------- this prints always -1078364196 (seems an address) 
18 
19  if(lo_send(dest, "/fader/0", "f", elm_slider_value_get(sl[0]))==-1) 
20   printf("OSC error %d: %s\n", lo_address_errno(dest), lo_address_errstr(d est)); 
21 } 
+3

请将代码粘贴到你的问题 – 2009-12-11 18:00:59

+0

而且够了吧,我们可以看到它是如何编译... – retracile 2009-12-11 18:03:44

+0

还请后回调调用 – qrdl 2009-12-11 18:13:30

回答

5

你传递一个局部变量的地址作为参数传递给回调。所以当函数退出时,变量被释放。它的地址现在无效。当回调被调用时,你的局部变量的地址很可能被别的东西所使用,这解释了奇怪的(和不同的)值。

此外,正如其他文章中指出的,您错误地输入了您的snipset。

+0

这也是。应该有发现。 ;-) +1 – DevSolar 2009-12-11 18:08:54

+0

是的,我的错在粘贴我,我不匹配 – osc42 2009-12-11 18:11:18

1

我不太得到什么你的代码是干什么的,但:

int n = *((int*)data); 
printf("%d\n",i); 

i没有在这里定义;我假设代码访问一些全局变量或某些。你是从*data检索整数n,不i ...

0

您的代码应按照您已经贴吧...至少它为我(我也它发布到codepad):

#include <stdio.h> 

int callback(void *x) { 
    int n = *(int*)x; 
    printf("int in callback: %d\n", n); 
    return 0; 
} 

int driver(int (*fx)(void*), int x) { 
    printf("int in driver: %d\n", x); 
    fx(&x); 
    return 0; 
} 

int main(void) { 
    driver(callback, 42); 
    return 0; 
} 

必须有别的东西搞乱它了!

0

16 int n = ((int)data); 012f17 printf(“%d \ n”,& n); // < -------------------------------------此打印总是-1078364196(看起来是一个地址)

是的,它是一个地址。也许你会更自在地用十六进制查看它。 printf("0x%x", &n)

你在哪里使用i在回调中?在任何情况下,函数参数的范围都是函数本身。

我会做的是

void add_strip(int *i,char name[30]) 
{ 
    if(NULL == i){ 
    //error condition, return or set some error no or whatever you fancy. 
    } 
    blah blah blah... (use *i) 
    evas_object_smart_callback_add(sl[*i], "changed", vol_changed, i); 
} 

因此回调将有一个参考,以“我”,从所谓add_strip功能。这是留给你,以确保变量“我”不超出范围。