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++.
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.
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.
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.
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...
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é !