Allocation dynamique

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

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 ?

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?

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.

@+

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

Bien sûr. realloc() permet de redimensionner une zone allouée en conservant les données.

@+

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.

@+

Mouldolas:
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.

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.

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.

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?

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

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é

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().

@+

Merci à vous pour vos réponses.

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

Mouldolas:
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.

Regarde bien le code à la fin du topic Petite banque de données musicale - #8 by hbachetti - Français - Arduino Forum

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.

@+