2009-12-11 4 views
0

Почему я не распознан правильно в обратном вызове?передать int в обратный вызов C

Я думаю, что, возможно, потому, что после того, как 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 } 
+3

Просьба вставить код в свой вопрос –

+0

И достаточно того, что мы можем увидеть, как он компилируется ... – retracile

+0

Также, пожалуйста, напишите код обратного вызова – qrdl

ответ

5

Вы передаете адрес локальной переменной в качестве аргумента для обратного вызова. Поэтому, когда функция exit, переменная освобождается. Его адрес теперь недействителен. Когда вызывается обратный вызов, адрес вашей локальной переменной, скорее всего, используется чем-то другим, что объясняет странное (и другое) значение.

Кроме того, как указано в другом посте, вы ошибочно указали на ваш спэссет.

+0

Это тоже. Должен был заметить это. ;-) +1 – DevSolar

+0

да, моя вина в склеивании о несоответствии i, m – osc42

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) данные); 17 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. Вам остается убедиться, что переменная «i» не выходит за рамки.

Смежные вопросы