Arduino Forum

International => Français => Topic started by: FranckPERRET on Jan 14, 2018, 10:50 pm

Title: Crétion dynamique de P tableaux à S lignes
Post by: FranckPERRET on Jan 14, 2018, 10:50 pm
Bonjour a tous

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?

Merci d'avance.

Franck





 

Title: Re: Crétion dynamique de P tableaux à S lignes
Post by: J-M-L on Jan 14, 2018, 11:04 pm
3 possibilités:

- préallocation statique avec potentiellement du gâchis mémoire si vous avez une idée du Max pour P et S et que ça tient sur l'arduino

(en lisant une fois à vide le fichier pour calculer les S et P si pas écrit en début de fichier)

- approche standard en C avec malloc()

- approche standard en C++ avec new

Title: Re: Crétion dynamique de P tableaux à S lignes
Post by: FranckPERRET on Jan 15, 2018, 07:10 am
Merci pour votre réponse JML

Sais tu où trouver un bon site Web qui explique bien et simplement:  Malloc()  et  new


Confirme moi avec Arduino on peut programmer en C et C++

je croyais que c'était juste C.

Merci
Title: Re: Crétion dynamique de P tableaux à S lignes
Post by: J-M-L on Jan 15, 2018, 09:41 am
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 (https://openclassrooms.com/courses/apprenez-a-programmer-en-c/l-allocation-dynamique) 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)

Code: [Select]
// 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() {}
Title: Re: Crétion dynamique de P tableaux à S lignes
Post by: FranckPERRET on Jan 17, 2018, 08:46 pm
MERCI BEAUCOUP

Vraimant trop cool d'avoir écrit le code je vais le tester immédiatement.

MERCI
MERCI
MERCI
Title: Re: Crétion dynamique de P tableaux à S lignes
Post by: FranckPERRET on Jan 18, 2018, 07:29 pm
Trop génial ton programme fonctionne super bien.
Encore merci
Title: Re: Crétion dynamique de P tableaux à S lignes
Post by: J-M-L on Jan 18, 2018, 11:44 pm
Postez votre code qui gère la carte SD