2009-12-11 5 views
0

Pourquoi i n'est pas reconnu correctement dans le rappel?passer int à un rappel C

Je pense que peut-être parce qu'après add_strip() "i" est détruit, alors comment pourrais-je passer un int à ce rappel? Merci.

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 } 

Et le rappel est:

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

S'il vous plaît coller le code dans votre question –

+0

Et assez de cela que nous pouvons voir comment il compile ... – retracile

+0

Aussi s'il vous plaît signaler le code de callback invocation – qrdl

Répondre

5

Vous transmettez l'adresse d'une variable locale en tant qu'argument à un rappel. Ainsi, lorsque la fonction quitte la variable est désaffectée. Son adresse est maintenant invalide. Lorsque le rappel est appelé, l'adresse de votre variable locale est probablement utilisée par autre chose, ce qui explique la valeur étrange (et différente).

De plus, comme indiqué dans un autre post, vous avez mal tapé votre snipset.

+0

Cela aussi. Aurait dû repérer ça. ;-) +1 – DevSolar

+0

ouais, ma faute à coller sur le i, m discordance – osc42

1

je ne suis pas tout à fait ce que fait votre code, mais:

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

i n'est pas défini ici; Je suppose que le code accède à une variable globale ou quelque chose comme ça. L'entier que vous extrayez à partir de *data est n, et non i ...

0

Votre code devrait fonctionner comme vous avez posté ... au moins il fait pour moi (je l'ai également posté à 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; 
} 

Il doit y avoir quelque chose d'autre déconner comme ça!

0

16 int n = ((int) données); 17 printf ("% d \ n", & n); // < ------------------------------------- cela imprime toujours -1078364196 (semble une adresse)

Oui, c'est une adresse. Peut-être que vous seriez plus à l'aise de le voir en hexadécimal. printf("0x%x", &n)

Où utilisez-vous i dans le rappel? Dans tous les cas, la portée d'un argument de fonction est la fonction elle-même.

Ce que je ferais est ce

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); 
} 

Ainsi, le rappel aurait une référence à « i » de la fonction qui a appelé add_strip. Il vous appartient de vous assurer que la variable "i" n'est pas hors de portée.