Tableaux au secours

Bonjour

J'ai un code pour mise à jour d'une DS3231
Pour la sélection du jour je regarde le nombre d ejour du mois, si c'est février et une année bisextile ..
Ci dessous le type de données traitées, la fonction

Le retour de la fonction nbJour me donne 6 ?? Parfois ca me donne 28
Le code est basique, qu'est ce qui peux faire qu'une fois ca marche et l'autre non ?

J'ai essayé pas mal de choses sur le type de donnée, ...

typedef struct _Time {
byte hour;
byte min;
byte second;
byte day;
byte month;
byte year;
} Time;

byte nbJour(byte mois){
const byte nbDays = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
byte xx = nbDays[(int) mois - 1];
//Serial.println(xx);
return xx;
}

// code qui utilise la fonction

byte nbJ = nbJour(currentMenu->Time->month);
Serial.println(nbJ);
nbJ = (currentMenu->Time->month == 2 && bisextile(currentMenu->Time->year) == 1) ? nbJ + 1 : nbJ ;
Serial.println(nbJ);

mettez un code qui compile et entre balises de code…
Ne postez pas de “snippets” (Snippets R Us!)

votre fonction est correcte (juste modifié un peu)

byte nbJour(byte mois) {
  const byte nbDays[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  return nbDays[mois - 1];
}

void setup() {
  Serial.begin(115200);
  for (int mois = 1; mois <= 12; mois++) Serial.println(nbJour(mois));
}

void loop() {}

On a bien dans la console série

[color=purple]31
28
31
30
31
30
31
31
30
31
30
31[/color]

Merci J-M-L pour la page des snippets! Un régal avec même un petit « lmgtfy » caché!

Jambe:
Merci J-M-L pour la page des snippets! Un régal avec même un petit « lmgtfy » caché!

Cadeau de Nick Gammon !

Bonjour et désolé pour le format d emon message

Effectivement j'avais testé la boucle en début de loop qui fonctionnait

J'ai placé à différents endroits des Serial.print et parfois ca fonctionne et parfois non

Je suppose qu'une partie du code exécuté fait que qu'un paramètre a changé et que ca ne marche plus, c'était le but de la question : qu'est ce qui pourrait faire que cette fonction renvoie 6 alors que nul part cette valeur n'existe

Je vais ce soir mettre des log dans le code en partant du loop et en allant vers ma fonction pour essayer de voir quelle partie fait planter

merci encore

Vous avez sans doute un débordement mémoire ailleurs dans votre code. Le problème ne vient pas de votre fonction

Dans la fonction pour la rendre plus solide vous pourriez tester si le mois demandé est bien entre 1 et 12 avant d’aller lire dans le tableau.

Bonjour,

Est ce que month commence à 0 ou à 1. Ce qu'on peut supposer quand on voit la ligne suivante

 nbJ = (currentMenu->Time->month == 2 && bisextile(currentMenu->Time->year) == 1) ? nbJ + 1 : nbJ ;

Comme le dit JML le problème vient du paramètre passé à la fonction. Testes le paramètre passé

byte nbJour(byte mois) {
  if (mois>11)
  {
    Serial.print("Paramètre incorrect. mois=");
    Serial.println(mois);
    return 0;
  }
  const byte nbDays[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  byte xx = nbDays[(int) mois - 1];
  //Serial.println(xx);
  return xx;
}

Vu qu’il fait -1 pour l’index, c’est qu’il attend entre 1 et 12 donc pas faire if (mois>11) {… // erreur mais if ((mois == 0 ) || (mois>12)) {… // erreur

Oups! :-[
Autant pour moi, je n'avais pas vu le -1

Pour le test du paramètre je vais ajouter car effectivement c'est plus propre mais j'avais mis un Serial.print sur le mois et pour février ça m'affichait bien 2 et 6 pour le nombre de jour

qu' entendez vous par "débordement mémoire"

merci à tous pour vos pistes

Bidou76:
qu' entendez vous par "débordement mémoire"

un bug dans le reste de votre code qui met le bazar :slight_smile: