Tableau char pas pris en compte

Bonjour,

Wemos D1 et DS3231

Je désire améliorer un simple croquis en ajoutant le nom du mois, mais le résultat est assez inattendu !

#include <Wire.h>
#include "RTClib.h"

RTC_DS3231 rtc;

char nomsJours[7][4] = {"Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam"};
char nomsMois[12][4] = {"jan", "fev", "mar", "avr", "mai", "jun", "jul", "aou", "sep", "oct", "nov", "dec"};

const int nbreJoursMois[] = {31, 28, 31, 30, 31, 30, 31, 31, 31, 31, 30, 31};
char dh[30]; // "Dim 5 dec 2021 16:49:50\0"  Le charactère \0 pour terminer la chaine de caractère

void setup () {
  Serial.begin(115200);

  delay(3000); // wait for console opening

  if (rtc.begin()) {
    Serial.println(F("Horloge présente"));
  } else {
    Serial.println("Horloge non trouvée");
    while (1);
  }

  if (rtc.lostPower()) {
    Serial.println("RTC lost power, lets set the time!");
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }

  DateTime now = rtc.now();
  AfficheDateHeure( now);
}

void loop () {}

void AfficheDateHeure(DateTime now) {
  // éclatement intermédiaire pour accélérer (si si) le traitement de sprintf
  int jo = now.day();
  int js = now.dayOfTheWeek();
  int mo = now.month();
  int an = now.year();
  int he = now.hour();
  int mi = now.minute();
  int se = now.second();
  // dh sera utilisé pour être affiché sur une matrice MAX719
  sprintf(dh, "%s %d %s %d %02d:%02d:%02d", nomsJours[js], jo, nomsMois[mo], an, he, mi, se);
  Serial.println(dh);
  Serial.println(js);
  Serial.println(nomsJours[js]);
  Serial.println(mo);
  Serial.println(nomsMois[mo]);
}

Et voilà le résultat : Dim au lieu de dec

Horloge présente
Lun 6 Dim 2021 13:41:05
1
Lun
12
Dim

Si je place la ligne du tableau des nomMois avec celles des nomJours, le résultat est encore plus loufoque : un carré apparait à la place du mois.

Si vous avez une piste, merci d'avance !

Horloge présente
Lun 6  2021 14:04:46
1
Lun
12


ça sent le débordement mémoire :slight_smile:

les indices dans un tableau commencent à 0 donc assurez vous que pour Janvier vous ayez 0 et décembre 11 quand vous appelez int mo = now.month(); ➜ est-ce le cas dans votre bibliothèque? si ce n'est pas le cas, un petit -1 sera le bienvenu

sinon déclarez les comme cela, c'est plus simple

const char * nomsJours[] = {"Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam"};
const char * nomsMois[] = {"jan", "fev", "mar", "avr", "mai", "jun", "jul", "aou", "sep", "oct", "nov", "dec"};

Juste !
con que je suis ! pas encore testé mais l'erreur est là.
J'avais d'abord utilisé les pointeurs

const char * 

Avec bien entendu le même problème !
Comme quoi, un relecteur aguerri n'est pas superflu !

Merci !

Édit : testé et OK !
En fait, si on n'était pas en décembre, j'aurais tout de suite vu l'erreur à cause du décalage d'un mois. Mais là, il allait lire hors de sa zone.
Merci encore !

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.