2009-12-11 99 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功能。這是留給你,以確保變量「我」不超出範圍。