Go Down

Topic: Problème de calcul (Read 386 times) previous topic - next topic

Pac2Kro

Voici une fonction qui me permet de transformer millis() en jours, heures, minutes et secondes.

Quote
void milli2JHMS()
{
  unsigned long depart;
  depart=millis()/1000;
  depart=(2*86400)+(22*3600)+(45*60)+39;//254739
  //depart=(2*86400)+(9*3600)+(9*3600)+(4*3600)+(45*60)+39;
  time_start[0]=depart/86400;
  time_start[1]=(depart%86400)/3600;
  time_start[2]=(depart%3600)/60;
  time_start[3]=depart%60;
}


time_start est déclarée : byte time_start[4];

Pour vérifier ma fonction, je récupère time_start dans une trame UDP udp.write(time_start,4); qui me donne :
0x02 0x04 0x21 0x17 soit en décimal 2j 4h 33mn 23s

Si je dé-commente la troisième ligne "depart" j'obtiens le bon calcul soit :
0x02 0x16 0x2D 0x27 soit en décimal 2j 22h 45mn 39s

Je ne comprends pas pourquoi "(22*3600)" ne fonctionne pas alors que "(9*3600)+(9*3600)+(4*3600)" fonctionne très bien.

fdufnews

Problème de type pour les constantes

Code: [Select]
void milli2JHMS()
{
  unsigned long depart;
  depart=millis()/1000;
  depart=(2*86400)+(22*3600L)+(45*60)+39;//254739
  //depart=(2*86400)+(9*3600)+(9*3600)+(4*3600)+(45*60)+39;
  time_start[0]=depart/86400;
  time_start[1]=(depart%86400)/3600;
  time_start[2]=(depart%3600)/60;
  time_start[3]=depart%60;
}

et ça marche

une opération entre 2 int donne un int comme résultat.
9*3600 reste inférieur à 32767 donc il tient dans un int
22*3600 entraîne un débordement car il ne rentre pas dans un int
Pour forcer le calcul en long il faut ajouter L aux constantes comme ça il n'y a pas de surprise.

Pac2Kro


Go Up