C++ moderne et µcontrôleurs

Bonjour,
Je continue mes « études » sur le C++ et je me demande si sur nos petits µcontrôleurs nous avons les mêmes possibilités qu’avec les classes vector, array, string et les itérateurs nous permettant de nous promener dans les conteneurs du C++ moderne. Voici un bout de code qui tourne sur CodeBlocks :

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    string tab {"tu texte"};
    auto debutTab{begin(tab)};
    auto finTab{end(tab)};
    *debutTab = 'd';

    for(auto i : tab){
    cout << i ;
    }
    cout<< endl;

    for (auto it {debutTab}; it !=finTab; ++it){
    cout << *it << endl;

    }


    return 0;

}

Il y a bien une classe vector mais est-elle utilisable sur AVR sans contrepartie sur la gestion de la mémoire ?

D’une manière générale ce langage moderne est bien plus simple que le C mais encore faut-il l'utiliser sur une plateforme adéquate !

Voilà, 300 pages pour rien je pense du moins en ce qui concerne arduino !

Je ne suis pas assez calé sur cette classe pour avoir un avis pertinent, mais je suppose qu'effectivement la mémoire pourrait être très limitant, surtout que la classe ne semble pas faire partis du standard porté par Arduino.

Je ne suis pas sûre de comprendre ce que tu veux dire par plus simple que le C.
Le C à la différence du C++ est justement suffisamment simple pour être porté sur n'importe quel plateforme sans trop de soucis, notamment sur la mémoire.

Après les Vector sont très utilisé sur les langages objet, ce n'est pas vraiment pour rien et cela utilise aussi la notion de template, qui est très importante en C++.

Bonjour @philippe86220

L'environnement Arduino ne se limite pas aux µC 8 bits AVR de nos jours, le terrain de jeu s'est étendu pour notre plus grand plaisir :wink:

" C++ moderne et microcontrolleurs 8 bits anciens" comme tire ?

Bonjour @terwal, Bonjour @al1fch,

Je comprends le C++ moderne plus facilement. L'apprentissage du C a en ce qui me concerne était plus difficile (peut-être parce que je n'y connaissais strictement rien).

C'est vrai @al1fch mais les bibliothèques standards du C++ du moins en ce qui concerne celles que je viens d'évoquer, ne semblent pas intégrées sur arduino toutes plateformes confondues. En fait c'est l'objet de ce fil de discussion.
Est-ce que je me trompe (je ne pense pas) ? la raison de leur absence ou de leur non utilisation est-elle due aux problèmes liés à la mémoire même sur les plateformes les mieux équipées (je pense que oui) ? mais votre avis est important !

N'ayant pas exploré le SDK des ESP32 je n'ai pas d'avis , il se peut aussi que l'absence de certaines fonctions dans l'environnement soit la conséquence d'un sorte d'alignement par le bas

l'extension ESP32 de l'IDE ARduino n'est qu'une surcouche au SDK d'ESpressif, surcouche qui n'a pas vocation à couvrir à 100% les fonctionnalités de cette puce accessibles via le SDK ( il reste possible dans un code écrit sous IDE Arduino pour ESP32 de faire appel à des fonctions du SDK non 'aduinisées')

Je pense que ton code fonctionnerait sur ESP32 sauf pour la partie liée à la bibliothèque iostream : là il faut en rester à Serial.print. Serial.printf fonctionne bien et je crois que printf aussi.

Bonjour @lesept

On peut utiliser :

/// @brief Active les modèles d’impression de style C++
template<class T> inline Print &operator <<(Print &str, T arg) {
  str.print(arg);
  return str;
}

Ça remplace les Serial.print.

Ca dépasse mes connaissances, mais le cout est-il connu ? Sinon, ça envoie où ?

https://en.cppreference.com/w/cpp/io/cout

OK, mais as-tu testé sur un ESP32 ?

Non, je vais le faire mais je ne suis pas chez moi jusqu'à la fin de la semaine :slightly_smiling_face:
Je verrai plus tard.

Merci

Philippe, tu peux faire un prog de test : tu crées un vector, et tu fais une boucle qui y empile des int (n'importe quoi) jusqu'à saturation de la mémoire. J'ai testé ça sur une Uno, ça ne va pas bien loin.
Conclusion: la STL (Standard Template Library), c'est ok si tu as de la mémoire.

Par ailleurs, le C++ ce n'est pas que la STL. C'est la programmation objet, l'encapsulation, la ré-utilisabilité... Alors, 300 pages sûrement pas pour rien !

Voici la documentation concernant la librairie Vector référencée par arduino cc
https://github.com/janelia-arduino/Vector. Rien à voir avec celle du C++ puisque la mémoire est allouée statiquement et non
dynamiquement et c'est bien normal :

"Un conteneur de séquence similaire au C++ std::vector , mais au lieu d'allouer de la mémoire dynamiquement, ce conteneur pointe vers un tableau de style c externe, alloué statiquement. La taille maximale est fixée au moment de la compilation, mais la taille peut changer en poussant et en extrayant des éléments du vecteur. L'allocation de mémoire statique est utilisée pour éviter les problèmes d'allocation dynamique sur les très petits processeurs embarqués. Il faut veiller à ne pas déréférencer un vecteur vide, accéder à des éléments au-delà des limites ou utiliser sans définir le tableau de stockage.

Cette bibliothèque est très similaire à Array , cependant Array stocke les données en interne dans le conteneur et cette bibliothèque stocke les données en externe. Le pointeur vers la mémoire externe fait que ce conteneur utilise plus de mémoire que le conteneur Array, mais le stockage des données en externe évite d'avoir besoin de la taille maximale comme paramètre de modèle de classe."

On a donc pas accès aux mêmes librairies que celles du C++ moderne et d'ailleurs c'est logique eu égard aux particularités des microcontrôleurs. Cependant donc, il existe cette librairie Vector proche de Array du c++ !
Reste à savoir si elle tient la route sur esp32. Je testerai la semaine prochaine mais je reste sceptique...
A moins que @J-M-L ne passe par là et vienne nous éclairer sur ce point en nous apportant la bonne réponse.

C'est bien vrai !

Bonne soirée et merci.

J'utilise le vector sur ESP32 en grande dimension (même des vecteurs de vecteurs) pour une application de perceptron multicouche et ça va très bien, aucun souci.

Signé : le @J-M-L du pauvre... :rofl:

LOL :slight_smile: - y'a d'autres programmeurs un peu chevronnés ici que moi et @lesept en fait partie !!

on peut utiliser vector et les joyeusetés du "vrai C++" (comme s'il y en avait un faux) sur les arduinos 32 bits comme un ESP32.

testez ceci par exemple

#include <vector>
std::vector<int> unVecteur = {7, 5, 16, 8};

void setup() {
  Serial.begin(115200);
  for (auto && valeur : unVecteur)
    Serial.println(valeur);
  }

void loop() {}

Bonsoir @J-M-L ,
j'ai fait un essai en rajoutant des instructions sur votre code :

#include <vector>
std::vector<int> unVecteur = {7, 5, 16, 8};

void setup() {
  Serial.begin(115200);
  unVecteur.push_back(48);
  unVecteur.push_back(49);
  Serial.print ("taille après ajout :"); Serial.println (unVecteur.size());
  for (auto && valeur : unVecteur) {
    Serial.println(valeur);
  }

  unVecteur.pop_back();
  Serial.print ("taille après suppression :"); Serial.println (unVecteur.size());
  for (auto && valeur : unVecteur) {
    Serial.println(valeur);
  }
}
void loop() {}

ça fonctionne parfaitement !
Du coup c'est la même librairie standard du C++ ?

C'est pas ce que je pense de vous.

Merci à tous les deux.

Ben oui c’est le vrai std::vector :slight_smile:

J'ai du merder (pardonnez moi l'expression) quelque part car sur une UNO j'ai pas réussi à la mettre en oeuvre.
ça c'est une bonne nouvelle, je n'ai pas perdu mon temps ! du coup array ça doit fonctionner aussi...

Merci et bonne soirée.

Comme je disais

Ce n’est pas une architecture 32 bits. Pas assez de mémoire pour ce genre de classes

Oui effectivement c'est normal.
Merci @J-M-L je testerai tout ça en rentrant chez moi sur esp32.
C++ c'est un langage puissant et convivial, tellement convivial qu'on dirait un langage évolué !

Merci et bonne journée.