Go Down

Topic: Allocation dynamique (Read 379 times) previous topic - next topic

Mouldolas

Bonjour.
Je débute avec les allocations dynamiques.
J'ai créé un tableau à 2 dimensions comme suit:

Code: [Select]
void Alloc() {
  t = new int* [ nLignes ];
  for (int i = 0; i < nLignes; i++)
    t[i] = new int[ nColonnes ];
}


Est il obligatoire de libérer la mémoire avec delete[] ?

Code: [Select]
void Free_Tab() {
  for (int i = 0; i < nLignes; i++)
    delete[] t[i];
  delete[] t;
}


Deuxième question:
Plus tard je veux que mon tableau s'incrémente en nombre de colonnes quand j'appuie sur un bouton.
Comment faire pour que l'adresse de cette nouvelle colonne soit à la suite de la fin de mon tableau?Et en rapport avec la première question si je libère la mémoire avec delete[] les valeurs dans les colonnes de mon tableau vont elles être perdues?

hbachetti

Salut.

Sincèrement si tu travailles sur une grosse carte avec beaucoup de RAM, pourquoi pas, mais sur un ATMEGA328P tu vas vite te retrouver confronté à des problèmes de fragmentation.

@+
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Mouldolas

Et sinon est ce que la méthode 'Malloc' 'Realloc' est plus adaptée voire 'Vector'?

hbachetti

#3
Oct 11, 2018, 05:23 pm Last Edit: Oct 11, 2018, 05:23 pm by hbachetti
Bien sûr. realloc() permet de redimensionner une zone allouée en conservant les données.

@+
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

hbachetti

Quote
Et en rapport avec la première question si je libère la mémoire avec delete[] les valeurs dans les colonnes de mon tableau vont elles être perdues?
Tout dépend de l'allocateur. La zone libérée peut encore contenir les données mais rien ne le garantit.
Si une nouvelle allocation a eu lieu entre temps, il y a peut être eu écrasement.
Et ce ne serait vraiment pas sérieux d'exploiter les données d'une zone mémoire libérée.

@+
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

bricoleau

Bonjour.
Je débute avec les allocations dynamiques...
Euh j'ai l'impression que tu roules droit vers la falaise, sans phares et par temps de brouillard...

Et si tu expliquais pourquoi tu penses avoir besoin d'allocation dynamique ?
Je parie qu'il existe une autre manière de répondre à ce besoin, dans le contexte arduino, avec beaucoup plus de chances d'arriver à un résultat satisfaisant.
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

Mouldolas

#6
Oct 11, 2018, 05:51 pm Last Edit: Oct 11, 2018, 05:54 pm by Mouldolas
Bonjour bricoleau.

Je dois dire que mon projet est ludique.

Je voudrais faire une partition musicale dynamique que j'exploiterai avec tone()

en gros chaque colonne contient la note et la durée de la note.

J'ai fait ce que je voulais avec un tableau statique mais je me demandais si faire un tableau dynamique serait mieux, mais d'après ce qu'a dit hbachetti je m'expose à d'autres problèmes d'ordre matériel.
 



bricoleau

Tu peux très bien avoir un tableau alloué de manière statique en ram au démarrage de l'arduino, de taille fixe, et dont les valeurs changent de manière dynamique.

Par exemple plusieurs mélodies stockées sur support non volatile (eeprom, carte SD, flash progmem, ...) chargées à tour de rôle dans le tableau pour être jouées.

Faut juste prévoir une taille de tableau qui permette de contenir la mélodie la plus longue.
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

Mouldolas

Merci pour ta réponse bricoleau.

Mais je suis toujours indécis. Est ce que tu penses qu'utiliser l'allocation dynamique pour un projet comme le mien est adapté à l'Arduino?

Quote
mais sur un ATMEGA328P tu vas vite te retrouver confronté à des problèmes de fragmentation

Alain46

Quote
Mais je suis toujours indécis. Est ce que tu penses qu'utiliser l'allocation dynamique pour un projet comme le mien est adapté à l'Arduino?
Certainement pas. Faire une allocation dynamique pour chaque note n'est pas envisageable avec aussi peu de Ram.
De plus tu ne teste nulle part si ton allocation dynamique est possible ou si elle a échoué
Un programme qui se compile sans erreur n'est pas forcément un programme qui fonctionne.

hbachetti

Quote
Je voudrais faire une partition musicale dynamique que j'exploiterai avec tone()
J'ai bossé sur un topic traitant de ce sujet il y a quelques semaines : lecture de morceaux de musique à partir d'une SD et joués avec tone().

https://forum.arduino.cc/index.php?topic=564175.msg3859989#msg3859989

@+
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Mouldolas

Merci à vous pour vos réponses.

Comme disait bricoleau je roulais droit vers la falaise, sans phares et par temps de brouillard...

biggil

en gros chaque colonne contient la note et la durée de la note.
Dans ce cas il vaut mieux faire un simple tableau (c-à-d à 1 dimension) de structures.

hbachetti

Regarde bien le code à la fin du topic https://forum.arduino.cc/index.php?topic=564175.msg3859989#msg3859989

J'utilise un tableau de structures :
- note
- octave
- durée

Il lit les fichiers à partir d'une SD.
Dans le post #6 il y a un petit programme PC écrit en C qui sert à générer les fichiers qui sont ensuite copiés sur la SD.
Je ne te cache pas que le plus gros du travail est de traduire les partitions.

Avec une table de 200 notes il est possible de jouer des morceaux assez longs.
Sinon il y a des cartes avec plus de RAM :
- MEGA : 8K
- DUE : 96K
- etc.

@+
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Go Up