为什么我在回调中无法正确识别?
我想也许是因为在add_strip()“i”被销毁之后,我怎么能把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 }
答案 0 :(得分:5)
您将局部变量的地址作为参数传递给回调。因此,当函数退出时,变量被释放。它的地址现在无效。调用回调时,局部变量的地址很可能被其他东西使用,这解释了奇怪的(和不同的)值。
另外,正如其他帖子中所述,您错误键入了snipset。
答案 1 :(得分:1)
我不太了解你的代码在做什么,但是:
int n = *((int*)data);
printf("%d\n",i);
此处未定义 i
;我假设代码访问某些全局变量或某些。您从*data
检索的整数为n
,而非i
...
答案 2 :(得分: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;
}
必须有其他东西弄乱它!
答案 3 :(得分:0)
16 int n = ((int )data); 17 printf(“%d \ n”,&amp; n); //&lt; -------------------------------------这打印总是-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的函数引用“i”。您需要确保变量“i”不在范围之外。