Parlons Arduino > Débuter

Tableaux et objet : création en fonction d'un paramètre

(1/3) > >>

Guillaume:
Bonjour,
je coince sur un problème de données avec un tableau :

--- Code: ---class essai
{
  public:
    essai(byte j=1, byte valeur=0);
    void print();
  private:
    byte n;
    byte essai[n];
};

essai::essai(byte j, byte valeur)
{
  n=j;
  for(byte i=0;i<n;i++){essai[i]=valeur;}
}

void essai::print()
{
  for(byte i=0;i<n;i++)
   {
     Serial.println(n);
     Serial.println(essai[i], DEC);
   }
}

essai essai(2);

void setup() {
   // put your setup code here, to run once:
   Serial.begin(9600);
}

void loop() {
   essai.print();
   delay(5000);
}
--- Fin du code ---

Mon but est de créer un tableau d'une certaine longueur dans une class en fonction d'une variable lors de la création de l'objet pour en faire tout un truc pour ma lib animlum. Je créerai avec plusieurs tableaux d'autres objets et autres variables.
J'ai donc fait ce code pour tester mais je n'y arrive pas. Un pb de portée de variable, si on le crée dans public, on n'a pas la longueur initiale et dans le constructeur il est accessible seulement dans le constructeur.

Je n'ai pas trouvé de mot clé pour faire d'une variable locale une variable globale.

Avez-vous des idées ?

Pierre59:
Bonjour

Je pense que le problème vient de l'erreur :

sketch_may27a:8: error: array bound is not an integer constant

la taille d'un tableau doit être une constante et pas une variable.

En C sur un ordinateur on ferait un "malloc()", mais sur Arduino c'est beaucoup plus délicat.

Pierre

savignyexpress:
Bonjour à tous,

Je ne pense pas que l'allocation dynamique de mémoire soit une bonne chose sur un système embarqué tel que le microcontrôleur qui équipe l'Arduino. La RAM du microcontrôleur est typiquement 2 KB pour un Atmega328 et c'est vite fait de la saturer.

Il ne faut en tout cas pas l'utiliser comme on le ferait sur un plus gros système, c'est à dire en allouant / désallouant des blocs de mémoire au fur et à mesure de l'exécution, le risque étant de fragmenter la mémoire. À la rigueur, allouer un bloc unique dans la fonction setup, si la taille nécessaire n'est pas connue à la compilation et dépend de paramètres de configuration (définis en EEPROM, via des jumpers ou par un menu de configuration par ex).

Dans sa librairie ScheduleTable, Jean-Luc effectue une allocation à la création de l'objet, cela peut être une source d'inspiration.

Pour une application en lien avec un réseau ferroviaire, j'imagine que la taille des tableaux doit être connue à la compilation ce d'autant plus qu'elle doit être liée à la configuration du réseau qui elle ne change pas à chaque exécution du programme de l'Arduino !

Meilleures salutations.

Marc-Henri

Pierre59:
Bonjour

Personnellement je fais des allocations/désallocations dynamiques dans le "loop()", pour des "buffers" d'images, mais je prends beaucoup précautions sur l'ordre des allocations et des désallocations.

Pierre

Guillaume:
La class appelle ensuite à la construction d'une lib qui, elle, doit s'organiser pour être malléable. En l'occurence, pour l'exemple, il s'agit de modifier ma lib AnimLum avec certaines animations enseigne, chenillard qui dépendent actuellement de 6 DEL pour en faire une polyvalente ou l'utilisateur décide du nbre de DEL, par exemple 10.
Il est facile de faire en ne prenant pas en compte le nombre réel mais le nombre possible maximum, par contre on prend de la mémoire pour rien. D'où l'idée de créer le tableau à posteriori. La taille n'est connu que de l'utilisateur final, pas de possibilité de le mettre avant.
Mais apparemment impossible ou pas à ma portée encore puisque je ne comprends pas tout ce que vous dites. Je n'ai pas encore une connaissance parfaite.
Cela attendra donc.

Navigation

[0] Index des messages

[#] Page suivante

Utiliser la version classique