将int传递给C回调

时间:2009-12-11 17:59:33

标签: c callback

为什么我在回调中无法正确识别?

我想也许是因为在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 }

4 个答案:

答案 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”不在范围之外。