From a4876fb128d318f5ed76055fba0016187e710554 Mon Sep 17 00:00:00 2001 From: Orestis <orestis.malaspinas@pm.me> Date: Tue, 21 Mar 2023 11:51:45 +0100 Subject: [PATCH] maj --- slides/fonctions_dordre_superieur.md | 51 ++++++++++++++++++++-------- slides/metadata.yaml | 2 +- 2 files changed, 38 insertions(+), 15 deletions(-) diff --git a/slides/fonctions_dordre_superieur.md b/slides/fonctions_dordre_superieur.md index 73918a7..7539576 100644 --- a/slides/fonctions_dordre_superieur.md +++ b/slides/fonctions_dordre_superieur.md @@ -135,9 +135,9 @@ vec3 mul(vec3 lhs, vec3 rhs){ * Une fonction d'ordre supérieur est une fonction qui prend en paramètre et/ou retourne une(des) autre(s) fonction(s). * Si on essayait de définir `operator`, c'est en fait une fonction qui prend deux paramètres (un terme de gauche et un terme de droite). On s'en aperçoit clairement avec la notation préfix (polonaise). - * `L + R` -> `+ L R` - * `L - R` -> `- L R` - * `L * R` -> `* L R` + * `L + R -> + L R` + * `L - R -> - L R` + * `L * R -> * L R` * Comment l'implémenter concrètement en C? @@ -153,20 +153,23 @@ vec3 apply_operator(operator op, vec3 lhs, vec3 rhs); * Pour passer une fonction en paramètre en C, nous devons la passer par référence, c'est à dire à l'aide d'un pointeur de fonction. -# Rappel pointeur de fonctions +# Pointeur de fonctions * Un pointeur de fonction se définit ainsi -```c -typedef + ```c <type retour> (*<nom ptr fonc>)(<type params(s)>); -``` + ``` +* Ou encore avec un `typedef` + ```c + typedef <type retour> (*<nom ptr fonc>)(<type params(s)>); + ``` * Dans notre cas, nous avons donc un type de fonction nommé `operator`, qui prend en entrée deux `double`{.c} et qui retourne un `double`{.c}. Ce qui nous donne -```c -typedef double (*operator)(double, double); -``` + ```c + typedef double (*operator)(double, double); + ``` # Implémentation (suite) @@ -188,7 +191,6 @@ vec3 apply_operator(operator op, vec3 lhs, vec3 rhs){ ```c typedef double (*operator)(double, double); - vec3 apply_operator(operator op, vec3 lhs, vec3 rhs){ vec3 res; res.x = op(lhs.x, rhs.x); @@ -196,9 +198,9 @@ vec3 apply_operator(operator op, vec3 lhs, vec3 rhs){ res.z = op(lhs.z, rhs.z); return res; } - -double add_dbl(double lhs, double rhs){return lhs + rhs;} - +double add_dbl(double lhs, double rhs){ + return lhs + rhs; +} vec3 add(vec3 lhs, vec3 rhs){ return apply_operator(add_dbl, lhs, rhs); } @@ -214,3 +216,24 @@ vec3 add(vec3 lhs, vec3 rhs){ * Reduce (réduction d'un vecteur à un seul élément) * `sum`, `multiply` +# 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]); + } + 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 diff --git a/slides/metadata.yaml b/slides/metadata.yaml index 57bf5e2..6428ea3 100644 --- a/slides/metadata.yaml +++ b/slides/metadata.yaml @@ -1,6 +1,6 @@ --- subtitle: "Programmation séquentielle en C, 2022-2023" -author: "Orestis Malaspinas (A401)" +author: "Orestis Malaspinas (A401) et un tout petit peu Michaël El Kharroubi" institute: "Informatique et Systèmes de Communication, HEPIA" lang: fr-CH revealjs-url: /reveal.js -- GitLab