struct et fichier .h

Bonjour

Je cherche à définir une structure, comme suit :

struct TimeSlot {
  byte device;
  byte days : 7;  // binary 0bSMTWTFS (Sunday, Monday, Tuesday ... Saturday) - use 7 bits
  int hourBegin;  // 00 ... 23
  int minBegin;   // 00 ... 59
  int hourEnd;
  int minEnd;
  int randomMin;  // randomly add / decrease begin and end times of xx minutes
} ;

Ensuite, je déclare un tableau de ces TimeSlot :

struct TimeSlot Slot[6];
Slot[0] = {Salon, 0b1111111, 7, 10, 8, 00, 0};
Slot[1] = {Salon, 0b1000001,21, 45,23, 15, 0};

Ceci est placé dans un fichier .h que je référence dans mon fichier .ino

#include "Timing.h"

A la compilation, j'obtiens ce message

Timing.h:13: error: 'Slot' does not name a type

Slot[0] = {Salon, 0b1111111, 7, 10, 8, 00, 0};

J'ai essayé
extern struct TimeSlot Slot[6];sans succès.

Que se passe-t-il ?

en gros même problème que ce que j'explique ici

en C ou C++, la définition se fait soit en même temps que la déclaration, soit si elle est séparée elle doit être dans une fonction.

donc si vous regroupez déclaration et définition ça donne ça (pas besoin de répéter struct et la dimension est calculée par le compilo grace à la liste fournie)

TimeSlot Slot[] = {
  {Salon, 0b1111111, 7, 10, 8, 00, 0}, // ATTENTION A L'USAGE DE 00 --> le 0 devant veut dire notation en Octal
  {Salon, 0b1000001,21, 45,23, 15, 0}
};

qui devrait fonctionner ou alors il faut mettre dans le setup (et c'est plus verbeux)

Slot[0].device = Salon;
Slot[0].days = 0b1111111;
Slot[0].hourBegin= 7;
Slot[0].minBegin= 10;
Slot[0].hourEnd= 8;
Slot[0].minEnd= 0;
Slot[0].randomMin= 0;

Slot[1].device = Salon;
Slot[1].days = 0b1000001;
Slot[1].hourBegin= 21;
Slot[1].minBegin= 45;
Slot[1].hourEnd= 23;
Slot[1].minEnd= 15;
Slot[1].randomMin= 0;

car on ne peut pas définir d'un coup le tableau.

Dire que les jours sont sur 7 bits ne vous apportent pas vraiment un gain de place puisque vous n'avez rien qui tient sur 1 bit (vous pourriez éventuellement prévoir 1 bit pour dire si ce slot est actif ou pas :slight_smile: ) et vous pouvez gagner plein d'octets car les heures et minutes (voire le random) n'ont pas besoin d'être des int, mais juste des uint8_t (1 seul octet) --> ça suffit pour coder de 0 à 255 donc OK pour 0-60 ou 0-23. Vous pouvez aussi prendre des int8_t si vous avez besoin d'avoir une valeur négative)

OK,je comprends, merci.

Les 7 bits, c'est plus pour tester ce truc que j'ai trouvé par hasard que pour faire des économies. J'utilise un ESP32, donc pas de problème de mémoire en vue pour l'instant...