Problème tableau

Bonjour à Tous,

J'ai un problème avec deux tableaux.

J'ai une fonction "getTime" qui extrait une variable du tableau "tabHeure" et une copie de cette fonction "getTime2" qui extrait une variable du tableau "tabHeure2"

Ca marche très bien pour la prèmière fonction, mais pas du tout avec la seconde qui me renvoie toujours le résultat : 8264.

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

RtcDS3231<TwoWire> rtcObject(Wire); 

int tabHeure[52]; 
int tabHeure2[52]; 
  
void setup(){  
  tabHeure[0]=30300;
  tabHeure[1]=30000;
  tabHeure[2]=29700;
  tabHeure[3]=29280;
  tabHeure[4]=28800;
  tabHeure[5]=28200;
  tabHeure[6]=27600;
  tabHeure[7]=26700;
  tabHeure[8]=26100;
  tabHeure[9]=25200;
  tabHeure[10]=24300;
  tabHeure[11]=23400;
  tabHeure[12]=22500;
  tabHeure[13]=21600;
  tabHeure[14]=20700;
  tabHeure[15]=20400;
  tabHeure[16]=19800;
  tabHeure[17]=19800;
  tabHeure[18]=19800;
  tabHeure[19]=19800;  
  tabHeure[20]=19800;
  tabHeure[21]=19800;
  tabHeure[22]=19800;
  tabHeure[23]=19800;
  tabHeure[24]=19800;
  tabHeure[25]=19800;
  tabHeure[26]=19800; // I get this value 
  tabHeure[27]=19800;
  tabHeure[28]=19800;
  tabHeure[29]=19800;  
  tabHeure[30]=19800;
  tabHeure[31]=19800;
  tabHeure[32]=19800;
  tabHeure[33]=19800;
  tabHeure[34]=20500;
  tabHeure[35]=21000;
  tabHeure[36]=21500;
  tabHeure[37]=22500;
  tabHeure[38]=23000;
  tabHeure[39]=23700;  
  tabHeure[40]=24800;
  tabHeure[41]=26000;
  tabHeure[42]=27200;
  tabHeure[43]=27500;
  tabHeure[44]=27500;
  tabHeure[45]=28000;
  tabHeure[46]=28500;
  tabHeure[47]=29000;
  tabHeure[48]=29500;
  tabHeure[49]=30000;
  tabHeure[50]=30600;
  tabHeure[51]=30600;

  tabHeure2[0]=63000;
  tabHeure2[1]=63000;
  tabHeure2[2]=63000;
  tabHeure2[3]=63000;
  tabHeure2[4]=63000;
  tabHeure2[5]=63000;
  tabHeure2[6]=63000;
  tabHeure2[7]=63000;
  tabHeure2[8]=63500;
  tabHeure2[9]=64800;
  tabHeure2[10]=65700;
  tabHeure2[11]=66600;
  tabHeure2[12]=67200;
  tabHeure2[13]=67800;
  tabHeure2[14]=69000;
  tabHeure2[15]=70500;
  tabHeure2[16]=72000;
  tabHeure2[17]=72600;
  tabHeure2[18]=73200;
  tabHeure2[19]=73800;  
  tabHeure2[20]=73800;
  tabHeure2[21]=73800;
  tabHeure2[22]=73800;
  tabHeure2[23]=73800;
  tabHeure2[24]=73800;
  tabHeure2[25]=73800;
  tabHeure2[26]=73800; // I should get this value, instead i get 8264.
  tabHeure2[27]=73800;
  tabHeure2[28]=73800;
  tabHeure2[29]=73800;  
  tabHeure2[30]=73800;
  tabHeure2[31]=73800;
  tabHeure2[32]=73800;
  tabHeure2[33]=73800;
  tabHeure2[34]=73500;
  tabHeure2[35]=73000;
  tabHeure2[36]=72700;
  tabHeure2[37]=71800;
  tabHeure2[38]=71200;
  tabHeure2[39]=70800;  
  tabHeure2[40]=69800;
  tabHeure2[41]=69000;
  tabHeure2[42]=68500;
  tabHeure2[43]=68000;
  tabHeure2[44]=67700;
  tabHeure2[45]=67000;
  tabHeure2[46]=66200;
  tabHeure2[47]=65000;
  tabHeure2[48]=64000;
  tabHeure2[49]=63500;
  tabHeure2[50]=63200;
  tabHeure2[51]=63000;
  Serial.begin(115200);
  int annee = 23;
  int mois = 06;
  int jour = 30;
  int heure = 10;
  int minut = 30;
  int sec = 0;
  rtcObject.Begin();
  RtcDateTime currentTime = RtcDateTime(annee, mois,jour, heure, minut, sec); 
  rtcObject.SetDateTime(currentTime);   
   
}
void loop(){ 
  getTime();
  getTime2(); 
  delay(2000);
  }

int getTime(){
  int jour=0;
  RtcDateTime currentTime = rtcObject.GetDateTime();
  int jourParMois[13];
  jourParMois[1]=31; // Nombre de jours par mois
  jourParMois[2]=28;
  jourParMois[3]=31;
  jourParMois[4]=30;
  jourParMois[5]=31;
  jourParMois[6]=30;
  jourParMois[7]=31;
  jourParMois[8]=31;
  jourParMois[9]=30;
  jourParMois[10]=31;
  jourParMois[11]=30;
  jourParMois[12]=31;
  int moisEnVrai = currentTime.Month() + 1; 
  for(int i=1 ; i<moisEnVrai ; i++)
  {  
  jour = jour + jourParMois[i]; 
  }
  int semaine = jour/7;
  int semaine2 = semaine +1;
  int sec2 = tabHeure[semaine2];
  Serial.print("Seconde apres minuit pour le lever de soleil : ");
  Serial.println(sec2);
  return sec2; 
}

int getTime2(){
  int jour=0;
  RtcDateTime currentTime = rtcObject.GetDateTime();
  int jourParMois[13];
  jourParMois[1]=31; 
  jourParMois[2]=28;
  jourParMois[3]=31;
  jourParMois[4]=30;
  jourParMois[5]=31;
  jourParMois[6]=30;
  jourParMois[7]=31;
  jourParMois[8]=31;
  jourParMois[9]=30;
  jourParMois[10]=31;
  jourParMois[11]=30;
  jourParMois[12]=31;
  int moisEnVrai = currentTime.Month() + 1; 
  for(int i=1 ; i<moisEnVrai ; i++)
  {  
  jour = jour + jourParMois[i]; // Cumul les jours depuis le début de l'année
  }
  int semaine = jour/7; // Le transforme en semaine
  int semaine2 = semaine +1; // Rajoute 1
  int sec = tabHeure2[semaine2]; // Apel le tableau "tabHeure2[26]" qui devrait me donner 73800 et me donne à la place 8264...
  Serial.print("Seconde apres minuit pour le lever de soleil : ");
  Serial.println(sec);
  return sec; 
}

Auriez-vous une idée de ce qui cloche avec cette deuxième fonction ou ce deuxième tableau ?
D'avance merci

Et bien les valeurs n'entre pas dans un int qui est limité à l'intervalle [-32768, 32767].
Ça ne rentrerait pas non plus dans un unsigned int qui est limité à l'intervalle [0, 65535].
Il faudrait faire un tableau de long.

A signaler, si tu avais activé le compte-rendu détaillé de la compilation tu aurais eu ces messages

/tmp/.arduinoIDE-unsaved2023530-13944-znrm74.6b4s/sketch_jun30a/sketch_jun30a.ino:79:17: warning: overflow in implicit constant conversion [-Woverflow]
   tabHeure2[10]=65700;
                 ^~~~~
/tmp/.arduinoIDE-unsaved2023530-13944-znrm74.6b4s/sketch_jun30a/sketch_jun30a.ino:80:17: warning: overflow in implicit constant conversion [-Woverflow]
   tabHeure2[11]=66600;

Bonjour
vous devriez utiliser des uint32_t pour declarer la fonction getTime2, les tableaux tabHeure et tabHeure2 (au moins)... Ca eviterait un underflow (repliement modulo 65536)

point cosmetique Il y a des façons plus concises d'initialiser des tableaux (tabHeure et tabHeure2 devraient être des constantes) ... et ne pas oublier que 2024 sera bissextile...
Edité : cross posted with fdufnews (donne des long comme solution, je donne des uint32_t et const uint32_t; c'est équivalent)

Puisque tous les éléments des tableaux se terminent par deux zéros, tu peux aussi les diviser par 100 ( par exemple tabHeure2[40]=69800; devient tabHeure2[40]=698; ), ça permettra d'économiser quelques octets de mémoire puisqu'un entier de 16 bits suffira pour stocker toutes ces valeurs. Puis multiplier par 100 lorsque tu veux faire ton calcul.

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