Bonjour à tous,
J'ai actuellement un problème.
J'aimerais créer une fonction (callback_func) qui en retourne une autre (callback) (selon les arguments de la première) pour la passer à une autre fonction (get) qui l'utilisera en tant que fonction de callback.
Je ne sais pas si c'est très parlant pour vous, alors que je vais tâchez de vous donner un exemple, que j'espère simple à comprendre.
- J'utilise GCC (et donc son extension pour les nested functions)
- J'ai omis les déclarations de prototypes
Ici, la fonction callback_func est multiple_of, les fonctions callback sont is_odd ou encore multiple_of_3 et la fonction get est get_first_int.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 #include <stdlib.h> #include <stdbool.h> bool get_first_int(int * ptr, const int list[], const size_t size, bool (*func)(const int)) { bool found; unsigned int i; for(found = false, i = 0; !found && i < size; i++) { if(func(list[i])) { *ptr = list[i], found = true; } } return found; } bool is_odd(const int i) { return i & 1; } bool multiple_of_3(const int i) { return multiple_of(3)(i); } bool (*multiple_of(const int multiple))(const int) { bool func(const int i) { div_t d = div(i, multiple); return d.quot != 0 && d.rem == 0; } return func; }
Ainsi j'aimerais pouvoir écrire :
C'est à dire fournir en tant que fonction de callback, à get_first_int, directement la fonction retournée par callback_func, et non une fonction globale (comme multiple_of_3).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> int main(void) { int res, list[7] = {0, -6, 2, 3, 6, 1, 5}; bool found; found = get_first_int(&res, list, sizeof(list) / sizeof(*list), multiple_of(3)); if(found) { printf("La Première Correspondance est '%i'\n", res); } else { puts("Aucune Correspondance Trouvée..."); } return EXIT_SUCCESS; }
Or, le problème, c'est que cela ne va pas marcher, étant donné que la fonction retournée par callback_func est locale et donc la zone mémoire est inaccessible dans ma fonction get.
J'aimerais donc savoir comment contourner le problème, de façon propre.
Merci d'avance à vous !
Cordialement,
Hiz0
Partager