Crétion dynamique de P tableaux à S lignes

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() {}