diff --git a/slides/fonctions_dordre_superieur.md b/slides/fonctions_dordre_superieur.md index 7539576b37668c1b4c47313943fe0de78ea333f3..d4545d20ec81afdbf4766e56d7250f5d1dbae54a 100644 --- a/slides/fonctions_dordre_superieur.md +++ b/slides/fonctions_dordre_superieur.md @@ -218,22 +218,60 @@ vec3 add(vec3 lhs, vec3 rhs){ # Le map -```c -typedef double (*operator)(double); -double *map(operator op, double *tab, size_t size) { - double *res = malloc(sizeof(*res) * size); - for (int i = 0; i < size; ++i) { - res[i] = op(tab[i]); +* Exemple d'application + + ```c + typedef double (*operator)(double); + double *map(operator op, double *tab, size_t size) { + double *res = malloc(sizeof(*res) * size); + for (int i = 0; i < size; ++i) { + res[i] = op(tab[i]); + } + return res; } - return res; -} -double add_one(double val) { - return val + 1; -} -double sqr(double lhs){ - return apply_operator(add_dbl, lhs, rhs); -} -double tab[] = {1.0, 2.0, 3.0}; -double *square = map(sqr, tab, 3); -double *and_one = map(add_one, square, 3); -``` \ No newline at end of file + double add_one(double val) { + return val + 1; + } + double sqr(double val){ + return val * val; + } + double tab[] = {1.0, 2.0, 3.0}; + double *square = map(sqr, tab, 3); + double *and_one = map(add_one, square, 3); + ``` + +# Le map + +* Permettrait le chaînage. + + ```C + double *sqr_and_one = map(add_one, map(sqr, tab, 3), 3); + ``` +. . . + +* Problème? + +. . . + +* Allocation dynamique... fuite mémoire. + +. . . + +* Solution? + +. . . + + ```c + typedef double (*operator)(double); + double *map(operator op, double *tab, size_t size) { + double *res = malloc(sizeof(*res) * size); + for (int i = 0; i < size; ++i) { + res[i] = op(tab[i]); + } + free(tab); + return res; + } + ``` + +* Problème potentiel? +* **Attention au double free!**