Merci Jean-Luc. Ce fil est pour moi une tres bonne initiative car il permet de partager des "petites astuces" de programmation souvent simples a utiliser et qui nous simplifient les developpements.
Concernant les fonctions lambda, je trouve leur usage particulierement interessant comme parametre de fonction.
La principale difficulte tient a la lecture du code un peu "deroutante".
Moi qui aime beaucoup utiliser les tableaux, (
http://www.locoduino.org/spip.php?article227), je vous propose "Range-based for loop" qui fait aussi partie de la specification C++11. C'est l'equivalent de "for each" qui existe dans d'autres langages (Java, PHP, JavaScript...) mais qui manquait vraiment en C++.
Cette fonction permet de parcourir le contenu d'un tableau (collection) en fonction de ses items et non de ses indexes comme on le connait avec la boucle "for in". Dans le cas de Range-based for loop, il faut comprendre : "for
elem in
collectionPetit exemple.
/*
Range-based for loop
c++11
*/
int v[] = { 1, 4, 3, 8, 2}; // Un tableau d'entiers v
void setup() {
Serial.begin(115200);
for (int elem : v) {
Serial.print(elem);
Serial.print(" "); // Ecrit : 1 4 3 8 2
}
}
void loop() {
// put your main code here, to run repeatedly:
}
C'est la valeur de l'element du tableau qui est ici recuperee directement evitant de passer par son index v[0], v[1]....
Voici un autre exemple qui montre un peu plus l'interet et qui utilise une fonction lambda.
/*
Range-based for loop
c++11
*/
int v[] = { 1, 4, 3, 8, 2}; // Un tableau d'entiers v
void setup() {
Serial.begin(115200);
for (int elem : v)
Serial.print([&elem]() { return elem % 2; }()); // Ecrit : 10100
}
void loop() {
// put your main code here, to run repeatedly:
}
Cette fonction peut par exemple permettre de commuter l'etat d'une broche (0 ou 1) en fonction de valeurs contenues dans un tableau.
Autre exemple, cette fois avec des Strings :
/*
Range-based for loop
c++11
*/
String x[] = { "Bonjour ", "Loco", "duino"}; // Un tableau de Strings x
void setup() {
Serial.begin(115200);
for (String elem : x)
Serial.print(elem); // Ecrit : Bonjour Locoduino
}
void loop() {
// put your main code here, to run repeatedly:
}
Ce meme exemple avec une fonction lambda pour la demonstration mais qui n'apporte rien en terme de programmation (il existe plus simple dans ce cas).
/*
Range-based for loop
c++11
*/
String x[] = { "Bonjour ", "Loco", "duino"}; // Un tableau de Strings x
void setup() {
Serial.begin(115200);
String str;
for (String elem : x) { // elem in x
str += [&elem]() {
return elem;
}();
}
Serial.print(str); // Ecrit : Bonjour Locoduino
}
void loop() {
// put your main code here, to run repeatedly:
}
Par contre, on voit mieux l'utilite dans le cas ou l'on chercherait a commuter l'etat de broches contenues dans un tableau pins[] selon que les valeurs contenues dans un tableau v[] sont paires ou impaires. Ici, la fonction anonyme f() est un objet avec une syntaxe proche de ce que l'on connais en Javascript par exemple.
/*
Range-based for loop
c++11
*/
int v[] = { 1, 4, 3, 8, 2}; // Un tableau d'entiers v
int pins[] = { 2, 3, 8, 9, 10 }; // Un tableau de pins
void setup() {
Serial.begin(115200);
for (int elem : v) {
static int i = 0;
pinMode(pins[i], OUTPUT);
auto f = [&elem] () {
return elem % 2;
};
digitalWrite(pins[i], f());
i++;
}
}
void loop() {
// put your main code here, to run repeatedly:
}