Go Down

Topic: Problème de calcul (Read 402 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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy