Go Down

Topic: Problème de déclaration d'un array dans une classe (Read 2529 times) previous topic - next topic

Cloin

Aug 29, 2014, 04:03 pm Last Edit: Aug 29, 2014, 04:14 pm by Cloin Reason: 1
Bonjour à tous,
Ayant l'habitude des classes sous Processing, j'ai voulu utiliser la même méthode sous Arduino pour faire un code propre et je me suis donc basé sur le ce tuto pour apprendre les bases de la création d'une librairie: http://arduino.cc/en/Hacking/LibraryTutorial

Le projet est destiné à contrôler des LED strips digital, j'aimerais pour cela créer une classe LEDstrip qui sera composée de différentes fonctions pour les différentes animations des LED strips, cette classe doit aussi contenir un array pour stocker les valeurs de niveaux RGB de chacune des LEDs du strip.

Mon problème est que je voudrais déclarer cet array sans taille précise dans le fichier ledstrip.h puis choisir sa taille dans le constructeur pour pouvoir déterminer la taille de l'array en fonction du nombre de LEDs, ça doit paraître tordu mais la RAM étant limitée, je ne dois optimiser la taille des tableaux...

ledstrip.h:
Code: [Select]
#ifndef LedStrip_h
#define LedStrip_h

#include "Arduino.h"

class LedStrip
{
    public:
        LedStrip(int dmxUniv, int dmxStartChan, int nbLed);
       
        int ledArray[];
        int _dmxUniv;
        int _dmxStartChan;
        int nbChan;
       
        void pattern01(int _state);
       
   
    private:
       
       
};

#endif


ledstrip.cpp:
Code: [Select]
#include "Arduino.h"
#include "LedStrip.h"

LedStrip::LedStrip(int dmxUniv, int dmxStartChan, int nbLed)
{
     _dmxUniv = dmxUniv;
     _dmxStartChan = dmxStartChan;
     nbChan = nbLed*3;
     int ledArray[nbChan];

}

void LedStrip::pattern01(int _state)
{
   
    if (_state == 1){
   for(int i=0; i<nbChan ;i++){
   ledArray[i]=255;
  }
   
}
else if (_state == 0){
  for(int i=0; i<nbChan ;i++){
    ledArray[i]=0;
  }
}

}


Merci d'avance pour votre aide !

fdufnews

#1
Aug 29, 2014, 04:28 pm Last Edit: Aug 29, 2014, 04:31 pm by fdufnews Reason: 1
Tu pourrais remplacer ton int ledArray[] par un int *ledArray
Et dans le constructeur tu fais un malloc de la taille demandé.

Code: [Select]
LedStrip::LedStrip(int dmxUniv, int dmxStartChan, int nbLed)
{
     _dmxUniv = dmxUniv;
     _dmxStartChan = dmxStartChan;
     nbChan = nbLed*3;
     int *ledArray= (int*) malloc(nbChan * sizeof(int));

}

je ne l'ai pas fait là mais il faudrait tester que le malloc() se termine bien et que l'allocation a bien été faite en testant si ledArray est null ou pas et aussi remonter une erreur.

Cloin

Merci pour vos réponses !

je comprends le principe mais je n'ai jamais été confronté au concept du destructeur, cela s'exécute automatiquement ? Dois-je l'appeler via mon code principal  en fin de loop() ?

Cloin

Ah parce qu'avec cette technique le tableau est enregistré dans la mémoire flash ? Pas dans la RAM ? Et concernant l'utilisation du destructeur ?

Cloin

Ok merci pour ces infos, j'ai recopié le code que tu m'a donné pour mon .h et mon .cpp, il y avait juste une erreur sur la déclaration du destructeur dans le .h que j'ai corrigé.
Malheureusement j'ai le même résultat qu'avec le code que j'avais posté, le code compile sans problème mais une fois uploadé sur la carte il ne fonctionne pas... J'ai vu que cela pouvait venir d'une mauvaise optimisation de la RAM mais je fais mes tests avec un code léger et des tableaux de taille limités, je ne comprends pas ...

Cloin

Ta solution détaillée avec le rajout de la méthode init() fonctionne parfaitement, merci beaucoup pour ton aide, merci de participer aussi activement à la communauté Arduino FR :) !

Go Up