Problème avec #Define

Bonjour à tous,

Le problème est simple, j’ai un souci de compilation au niveau de la réutilisation des variables déclarées en #Define, voici un exemple qui NE fonctionne PAS.

//INCULDES ------------------------------------------------
#include "LPD8806.h"
#include "EfxLPD8806.h"
#include "SPI.h"

//SYSINFO--------------------------------------------------
//Property leds
#define             INTENSITY 127;      //Intensitée lumineuse, valeur possible: 0 - 127
#define                    PIXELS 32;      //Nombres total de pixels sur la guirlande
#define     ENABLEPOTARD false;      //Activation du potentiomètre pour le réglage de l'intensité0
#define       BROCHEPOTARD 10;      //Numéros de Broche de connection du potentiomètre


LPD8806 strip = LPD8806();

int Intensity = INTENSITY;

void setup(){
    strip.updateLength(PIXELS);    // <-----------  Ca bug ICI !!!
    strip.begin();           
}

void loop(){


}

Voici le même code mais modifié pour que cela fonctionne

//INCULDES ------------------------------------------------
#include "LPD8806.h"
#include "EfxLPD8806.h"
#include "SPI.h"

//SYSINFO--------------------------------------------------
//Property leds
#define             INTENSITY 127;      //Intensitée lumineuse, valeur possible: 0 - 127
#define                    PIXELS 32;      //Nombres total de pixels sur la guirlande
#define     ENABLEPOTARD false;      //Activation du potentiomètre pour le réglage de l'intensité0
#define       BROCHEPOTARD 10;      //Numéros de Broche de connection du potentiomètre


LPD8806 strip = LPD8806();

int Intensity = INTENSITY;
int Pixels = PIXELS;

void setup(){
    strip.updateLength(Pixels );    // <-----------  Ca bug plus !!!
    strip.begin();           
}

void loop(){


}

Ma question est pourquoi la première solution ne fonctionne pas???!! j’ai toujours fait comme ça dans tout les autres langages de programmation! Je tiens à préciser que j’utilise le compilateur fournis par arduino.

Merci de vos réponses.

Bonjour,

C'est la fonction updateLength :

// Change strip length (see notes with empty constructor, above):
void LPD8806::updateLength(uint16_t n) {
  if(pixels != NULL) free(pixels); // Free existing data (if any)
  numLEDs = n;
  n      *= 3; // 3 bytes per pixel
  if(NULL != (pixels = (uint8_t *)malloc(n + 1))) { // Alloc new data
    memset(pixels, 0x80, n); // Init to RGB 'off' state
    pixels[n]    = 0;        // Last byte is always zero for latch
  } else numLEDs = 0;        // else malloc failed
  // 'begun' state does not change -- pins retain prior modes
}

Apparemment il y a un calcul sur "n" = la variable en paramètre = PIXELS ou pixels. Tu ne peux pas redéfinir une variable #define.

#define         INTENSITY 127;

Non.

#define         INTENSITY 127

Oui

Salut,

Il ne faut pas mettre de point-virgule après #define, comme toute autre directive de pré-processeur...

++

Merci AWOL pour la bonne réponse!

Je crois qu il faut que je fasse une pause sur la prog ^^

Oui C'est juste SesechXP ! Merci aussi a AWOL pour la bonne réponse!

Et ça marche quand même avec la variable PIXELS en paramètre de .updateLength ?

Bonjour,

Au passage, juste pour compléter ;)

define est une fonction préprocesseur (étape avant la compilation) qui ne comporte aucune information de type.

Tu peut donc écrire sans probléme :

#define TOTO "tata"
#define PLOP 13.37
...

Par contre fait attention si tu travaille avec des nombres de taille "dure" signé / non signé (uint8_t, uint16_t, uint32_t, ...). Par défaut le compilateur prend le type le plus adéquat pour faire tenir la valeur, mais tu ne sait pas si il prendra un type signé / non signé et quelle sera la taille de la variable en mémoire.

Exemple : si tu fait un #define F_CPU 8000000 (grand classique) il est conseillé d'ajouter UL à la fin de la valeur pour forcer le compilateur à choisir un "Unsigned Long" comme type. En général il n'y as pas de probléme avec les #define, mais pour certains morceaux de code le suffixe de typage peut faire la différence ;)

C'est pourquoi dans les exemples du playground arduino tu ne verras aucun #define mais :

const int TOTO = 42;

par exemple ;)

Le const déclare une variable comme constante, avec un type prédéfini et une valeur non modifiable. Elle sera stocké en mémoire flash/ram (ou uniquement en flash suivant le compilateur) mais lors de la compilation le compilateur saura de suite quel type est cette constante et pourra ainsi afficher un warning si besoin.