Boost pour Arduino

J'avoue que je ne comprends pas grand chose, mais je vous le poste, au cas où ça vous parle plus...

Boost pour Arduino : on dirait un ensemble de fonctions supplémentaires en C++, Wikipedia dit que ça vise le remplacement de la bibliothèque standard de C++.

J'ai vu aussi sur le site de Nick Gammon la possibilité d'utiliser des lambda fonctions (tout à la fin du lien) en C++ :

// array of function pointers
void (*doActionsArray []) () =
 {
 [] { Serial.println (0); } ,
 [] { Serial.println (1); } ,
 [] { Serial.println (2); } ,
 [] { Serial.println (3); } ,
 [] { Serial.println (4); } ,
 };

void setup ()
  {
  Serial.begin (115200);
  Serial.println ();

  int action = 3;   // 3 is an example

  doActionsArray [action] ();
  }  // end of setup

void loop () { }

Salut

Boost est en effet une collection de fonctions qui aident le programmeur à ne pas réinventer la roue - par exemple des tas de fonctions de géométrie, arithmétique etc

le second code que vous avez posté se lit comme cela

On dit que doActionsArray est un tableau de pointeur sur fonction ne prenant aucun paramètre et ne retournant rien, dont la taille est définie par les initialization qui suivent

[color=blue]void[/color] (*doActionsArray []) [color=green]()[/color] =[size=8pt]
                               [color=purple]|[sub]->[/sub] pas de taille car le compilateur va compter les définitions[/color]
[/size]

ensuite donc dans le tableau on doit mettre pointeurs sur fonctions. Généralement en approche traditionnelle on définirait des fonctions du genre

void fonction0()
{
  Serial.println(0); 
}

void fonction1()
{
  Serial.println(1); 
}

et on mettrait dans le tableau fonction0 et fonction1.

Cela oblige à déclarer formellement les fonctions.

le langage C++, depuis C++11, supporte la notion de fermeture ou clôture (en anglais : closure). C'est un gros mot pour dire une fonction accompagnée de son environnement lexical - c'est à dire l'ensemble des variables non locales qu'elle a capturé, soit par valeur (c'est-à-dire par copie des valeurs des variables), soit par référence (c'est-à-dire par copie des adresses mémoires des variables).

Une clôture est donc créée par exemple lorsqu'une fonction est définie dans le corps d'une autre fonction et utilise des paramètres ou des variables locales de cette dernière.

Une Lambda expression va construire une clôture, c'est à dire un objet de type fonction capable de capturer des variables en contexte. La syntaxe est à lire ici.

Donc quand il met dans la première entrée de son tableau

[color=red][][/color] [color=blue]{ Serial.println (0); }[/color]

il dit je déclare une fonction lambda qui n'a aucun symbole capturé (les premiers crochets vides - ce sont les symboles visibles à l'intérieur du corps de la fonction) dont le corps de la fonction est { Serial.println (0); }

et ensuite il refait de même avec d'autres expressions lambda

au final donc le tableau contient 5 pointeurs sur fonctions qui impriment leur indice dans le tableau quand on les appelle.

par exemple quand il fait doActionsArray[3](); il va chercher l'expression lambda se trouvant en quatrième position (les indices commencent à 0) et donc ça va imprimer 3 sur la console Série.

ça aide ?

Oui, merci des explications !