Go Down

Topic: Crétion dynamique de P tableaux à S lignes (Read 761 times) previous topic - next topic

FranckPERRET

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





 


J-M-L

#1
Jan 14, 2018, 11:04 pm Last Edit: Jan 14, 2018, 11:06 pm by J-M-L
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

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

FranckPERRET

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

J-M-L

#3
Jan 15, 2018, 09:41 am Last Edit: Jan 16, 2018, 11:43 pm by J-M-L
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)

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() {}
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

FranckPERRET

MERCI BEAUCOUP

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

MERCI
MERCI
MERCI

FranckPERRET

Trop génial ton programme fonctionne super bien.
Encore merci

J-M-L

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Go Up