Je cherche à créer dynamiquement de P tableaux a S lignes chacun.
Je lise un fichier txt sur une carte SD.
Ce fichier contient plusieurs polygones P contenant chacun plusieurs sommets S (chaque sommet a des coordonnées x et y).
Au lancement du programme, je ne sais pas à l'avance combien il y a de polygones dans le fichier txt et je ne sais non plus combien il y a de sommet par polygone.
P est variable.
S est variable pour chaque polygones
Pour aller plus vite (par la suite) je veux stock les coordonnées des P polygones dans P tableaux
Chaque tableaux ayant chacun S lignes (une ligne par sommet de chaque polynôme).
Comment déclarer mes tableaux?
Comment remplir mes tableaux?
Comment lire les donnes dans les tableaux?
tout bon cours C parle de malloc() et tout bon cours C++ parle de new - je n'ai pas de préférence particulière (open classroom doit avoir ce qu'il vous faut par exemple )
Arduino n'utilise pas de langage propriétaire - c'est le compilateur C/C++ qui est utilisé pour la génération du binaire - donc oui vous pouvez faire du C++ sans soucis (aux contraintes près bien sûr du fait que vous faites tourner votre code ensuite sur un tout petit micro avec peu de mémoire et sans écran ni clavier - donc il faut y faire attention)
Voici un bout de code (tapé ici sans tester - donc je ne sais pas si ça fonctionne, mais c'est pour vous donner une idée du principe)
// un sommet est décrit par 2 coordonnées (ici entières courts (2x2 octets sur un UNO) - choix arbitraire bien sûr)
struct sommet_t {
int x;
int y;
};
// Un polygone est décrit par un ensemble de sommets et le nombre de sommets
struct polygone_t {
sommet_t * sommets; // un tableau dynamique de sommets
byte nombreDeSommets; // le nombre de sommets
};
// un tableau dynamique de polygones
polygone_t* ensembleDesPolygones;
// cette variable sert à mémoriser combien on en a
byte nombreDePolygones;
// ---------------------------------------------------
// cette fonction "plante" le programme en affichant un message d'erreur
// (si malloc() ne trouve plus de mémoire)
// ---------------------------------------------------
void memoryFull()
{
Serial.println(F("Memory full"));
while (true);
}
// ---------------------------------------------------
// imprimer le polygone N° n
// ---------------------------------------------------
void imprimerPolygone(const byte n)
{
if (n >= nombreDePolygones) return;
Serial.print(F("Le polygone "));
Serial.print(n);
Serial.print(F(" a "));
Serial.print(ensembleDesPolygones[n].nombreDeSommets);
Serial.println(F(" sommets."));
for (byte i = 0; i < ensembleDesPolygones[n].nombreDeSommets; i++) {
Serial.print(F("\t("));
Serial.print(ensembleDesPolygones[n].sommets[i].x);
Serial.print(F(","));
Serial.print(ensembleDesPolygones[n].sommets[i].y);
Serial.println(F(")"));
}
Serial.println();
}
// ---------------------------------------------------
// parcourir tous les polygones et les imprimer
// ---------------------------------------------------
void imprimerTousLesPolygones()
{
for (byte n = 0; n < nombreDePolygones; n++) imprimerPolygone(n);
}
// ---------------------------------------------------
void setup()
{
Serial.begin(115200);
// trouver le nombre de polygones en lisant le fichier
nombreDePolygones = random(3, 6); // ici on simule entre 3 et 5 polygones
ensembleDesPolygones = (polygone_t *) malloc(nombreDePolygones * sizeof(polygone_t));
if (ensembleDesPolygones == NULL) memoryFull(); // plus de mémoire on arrête le code
for (byte n = 0; n < nombreDePolygones; n++) {
// trouver le nombre de sommets du polygone n en lisant le fichier
ensembleDesPolygones[n].nombreDeSommets = random(3, 10); // ici on simule entre 3 et 9 sommets
// on alloue le tableau pour stocker les sommets
ensembleDesPolygones[n].sommets = (sommet_t *) malloc(ensembleDesPolygones[n].nombreDeSommets * sizeof(sommet_t));
if (ensembleDesPolygones[n].sommets == NULL) memoryFull(); // plus de mémoire on arrête le code
// ici lire le fichier pour les coordonnées x et y des sommmets (ici je les génère aléatoirement)
for (byte i = 0; i < ensembleDesPolygones[n].nombreDeSommets; i++) {
ensembleDesPolygones[n].sommets[i].x = random(-1000, 1001); // entier entre -1000 et 1000
ensembleDesPolygones[n].sommets[i].y = random(-1000, 1001);
}
}
imprimerTousLesPolygones();
// si au bout d'un moment vous n'avez plus besoin de la mémoire, il faut penser à la libérer
// tout ce qui a été alloué par malloc() doit être libéré par free()
for (byte n = 0; n < nombreDePolygones; n++) {
free(ensembleDesPolygones[n].sommets);
ensembleDesPolygones[n].sommets = NULL;
}
// une fois qu'on a viré tous les polygones on peut aussi virer le tableau qui les décrit
free(ensembleDesPolygones);
}
void loop() {}