aide pour structures complexes et pointeurs

j’espere poster dans la bonne rubrique… ! voila mon souci, je vais essayer d’etre clair… : j’essaye d’utiliser des structures pour definir des plages horaires par jour et par profil de semaine…
je definis donc les structures suivantes : (j’ai limité à 2 plages par jour, et 2 jours, et 2 profils)

typedef struct Plage //Structure pour plage horaires ( 5 bytes)
{ byte    HeurDeb; byte    MinDeb; byte    HeurFin; byte    MinFin; byte    Consigne; };

typedef struct Jour //Structure pour Jour (8 plages = 40 bytes)
{
Plage    plage1;  
Plage    plage2; 
};
typedef struct Profil //Structure pour Profil (7 jours)
{
Jour    lundi;  
Jour    mardi; 
};

je declare ensuite la variable suivante : struct Profil profil_1;
pour initialiser la zone de donnees correspondantes (taille fixe donc)
pas de probleme pour affecter des valeurs a chaque membre de cette stucture…( je pense faire des affectations simples type

profil_1.lundi.plage1.HeurDeb = 17; // 17h
profil_1.lundi.plage1.Consigne = 25; // 25°

par ex… etc…

mon probleme ensuite est d’acceder a l’élément Consigne en fonction du jour et de la plage horaire courante… j’ai donc crée une fonction pour me retourner la valeur de consigne quand le nb de minute donnée par mon horloge locale (hr,mn) donc 60*hr+mn, est compris dans l’intervalle correspondant de la bonne plage horaire soit le code suivant :

byte renvoyer_consigne ()
{
int time=60*hr+mn;  // nb de minutes de la journée
int timedeb,timefin;
// en mode auto definit valeur consigne suivant (choix_profil,jour,hr,mn)
  if (choix_profil == 1)
  { switch (jour)
    {
      case 1: // lun
        if (profil_1.lundi.plage1.Consigne) { // Consigne non nul donc plage definie
          timedeb=profil_1.lundi.plage1.HeurDeb*60 + profil_1.lundi.plage1.MinDeb;
          timefin=profil_1.lundi.plage1.HeurFin*60 + profil_1.lundi.plage1.MinFin;
          if (timedeb <= time <= timefin) return profil_1.lundi.plage1.Consigne; }
        if (profil_1.lundi.plage2.Consigne) { // Consigne non nul donc plage definie
          timedeb=profil_1.lundi.plage2.HeurDeb*60 + profil_1.lundi.plage2.MinDeb;
          timefin=profil_1.lundi.plage2.HeurFin*60 + profil_1.lundi.plage2.MinFin;
          if (timedeb <= time <= timefin) return profil_1.lundi.plage2.Consigne; }
      case 2: // mar
        if (profil_1.mardi.plage1.Consigne) { // Consigne non nul donc plage definie
          timedeb=profil_1.mardi.plage1.HeurDeb*60 + profil_1.mardi.plage1.MinDeb;
          timefin=profil_1.mardi.plage1.HeurFin*60 + profil_1.mardi.plage1.MinFin;
          if (timedeb <= time <= timefin) return profil_1.mardi.plage1.Consigne; }
        if (profil_1.mardi.plage2.Consigne) { // Consigne non nul donc plage definie
          timedeb=profil_1.lundi.plage2.HeurDeb*60 + profil_1.lundi.plage2.MinDeb;
          timefin=profil_1.lundi.plage2.HeurFin*60 + profil_1.lundi.plage2.MinFin;
          if (timedeb <= time <= timefin) return profil_1.lundi.plage2.Consigne; }
    }
  }
}

je bute comment coder pour eviter de me taper les 7 jours x 8 plages horaires pour chaque profil…!!
je pensais utiliser des pointeurs mais mes essais ne sont pas concluants … et je ne suis pas un pro des pointeurs… surtout pour acceder a des elements de structures imbriquées…

quelqu’un aurait t-il une methode à me suggerer pour m’eviter une “arduinite” aigue de l’index? et surtout une maniere élégante de resoudre ce souci…
merci à vous !!

Bonjour,

La bonne section pour poster ta question c’est ici. Demande à un modo de déplacer ton sujet en cliquant sur ‘Report to Moderator’

Tu peux utiliser des pointeurs et les initialiser avec l’adresse de la structure qui va bien.
Par exemple pour des pointeurs Plage

byte renvoyer_consigne ()
{
  int time = 60 * hr + mn; // nb de minutes de la journée
  int timedeb, timefin;
  // en mode auto definit valeur consigne suivant (choix_profil,jour,hr,mn)
  Plage *pPlage1;
  Plage *pPlage2;
  if (choix_profil == 1)
  {
    switch (jour)
    {
      case 1: // lun
        pPlage1 = &profil_1.lundi.plage1;
        pPlage2 = &profil_1.lundi.plage2;
        break;
      case 2: // mar
        pPlage1 = &profil_1.mardi.plage1;
        pPlage2 = &profil_1.mardi.plage2;
        break;
    }
    if (pPlage1->Consigne) { // Consigne non nul donc plage definie
      timedeb = pPlage1->HeurDeb * 60 + pPlage1->MinDeb;
      timefin = pPlage1->HeurFin * 60 + pPlage1->MinFin;
      if (timedeb <= time <= timefin) return pPlage1->Consigne;
    }
    if (pPlage2->Consigne) { // Consigne non nul donc plage definie
      timedeb = pPlage2->HeurDeb * 60 + pPlage2->MinDeb;
      timefin = pPlage2->HeurFin * 60 + pPlage2->MinFin;
      if (timedeb <= time <= timefin) return pPlage2->Consigne;
    }
  }
}