Go Down

Topic: [résolue] variable long dépassement, cast mal appliqué (Read 744 times) previous topic - next topic

skizoh

May 03, 2012, 09:40 am Last Edit: May 03, 2012, 01:41 pm by skizoh Reason: 1
Bonjour a tous,

ça fraisai longtemps que j'avais pas eu un problème du genre.. dépassement de capacité de variable...
Sa peut paretre bête mais j'ai tout tenté !!! tout lol unsigned long, long long, long unsigned int, unsigned int tout xDD

Ma valeur varie entre 1 000 et 500 000 pourtant, rien d'affolant, mais des que je dépasse les 32 000, négatif, énorme somme etc.. enfin bref le bordel quoi.. donc je vient à vous en espèrent qu'un bug arduino existe la dessus ou alors je vais continué a gemberger..

Je précise, ma valeur jusqu’à 32 000 n'a aucun défaut, donc elle parvient jusqu’à la variable etc, le problème c'est les grosses valeurs, peut importe le format ça passe pas quoi :s

Merci d'avance !

Skizo !
Un tien vaux mieux que deux tu l'auras !

fdufnews

Quote
Je précise, ma valeur jusqu'à 32 000 n'a aucun défaut, donc elle parvient jusqu'à la variable etc, le problème c'est les grosses valeurs, peut importe le format ça passe pas quoi

Un unsigned long va jusqu'à 4294967296 donc tu dois avoir un problème de codage.
Si tu as un problème au-dela de 32767 c'est qu'il y a un int qui traine quelque part.
Une constante sans le l derrière par exemple.
Une variable intermédiaire sur laquelle tu n'as pas fait un cast.
.....

Mets ton code on regardera.

skizoh

#2
May 03, 2012, 11:36 am Last Edit: May 03, 2012, 11:50 am by skizoh Reason: 1
envoie:
Code: [Select]


    modif_para_ronde[12]=byte(stop_ronde)>>24;
    modif_para_ronde[13]=byte(stop_ronde)>>16;
    modif_para_ronde[14]=byte(stop_ronde)>>8;
    modif_para_ronde[15]=byte(stop_ronde);
  //modif para ronde est un tableau de byte, et stop ronde un int


réception:
Code: [Select]

stop_ronde=((reception[12]<<24)+((reception[13]& 0xFF)<<16)+((reception[14]& 0xFF)<<8)+(reception[15]& 0xFF))*1000;
                                                                         //récepetion UDP reception => byte
           
Serial.print(stop_ronde);  //stop ronde => long int


donc résumé: 2 problèmes !!
- reception:
normalement 0 => max int   actuelle 0 => 255 max

-*1000 long int
normalement 0 => max long int  actuelle 0 => 32 000

Je sèche la..

Skizo !
Un tien vaux mieux que deux tu l'auras !

fdufnews

#3
May 03, 2012, 01:10 pm Last Edit: May 03, 2012, 01:30 pm by fdufnews Reason: 1
Quote
modif_para_ronde[12]=byte(stop_ronde)>>24;

le cast est fait avant le décalage
Je pense que ce que tu voulais faire c'était plutôt ça;
Code: [Select]
modif_para_ronde[12]=(byte)(stop_ronde>>24);

Quote
stop_ronde=((reception[12]<<24)+((reception[13]& 0xFF)<<16)+((reception[14]& 0xFF)<<8)+(reception[15]& 0xFF))*1000;

Je crois comprendre que reception est un tableau de byte donc convertir en unsigned long avant de décaler.
Code: [Select]
stop_ronde=(((unsigned long)reception[12]<<24)+(((unsigned long)reception[13]& 0xFF)<<16)+(((unsigned long)reception[14]& 0xFF)<<8)+((unsigned long)reception[15]& 0xFF))*1000L;

Edit : ajout du L à la constante

skizoh

hum, pour le premier je suis d'accord je vais aller voir, pour le deuxième je suis plus retenu mais je vais aller voir ça dessuite !

Skizo !
Un tien vaux mieux que deux tu l'auras !

skizoh


Je pense que ce que tu voulais faire c'était plutôt ça;
Code: [Select]
modif_para_ronde[12]=(byte)(stop_ronde>>24);

Je crois comprendre que reception est un tableau de byte donc convertir en unsigned long avant de décaler.
Code: [Select]
stop_ronde=(((unsigned long)reception[12]<<24)+(((unsigned long)reception[13]& 0xFF)<<16)+(((unsigned long)reception[14]& 0xFF)<<8)+((unsigned long)reception[15]& 0xFF))*1000L;


alors alors, problème résolue, les solutions sont les suivante:
Code: [Select]
modif_para_ronde[12]=byte(stop_ronde>>24);

et

Code: [Select]
stop_ronde=( long(reception[12]<<24)+long((reception[13]& 0xFF)<<16)+long((reception[14]& 0xFF)<<8)+long(reception[15]& 0xFF))*1000;
[/quote]

voilou :) merci beaucoup fdufnews :p

Vite fait bien fait =)

Skizo !
Un tien vaux mieux que deux tu l'auras !

fdufnews

Quote
voilou smiley merci beaucoup fdufnews :p

De rien

Remarque: c'est à dessein que j'ai utilisé des unsigned long pour les opérations. C'est un bonne pratique si tu ne veux pas avoir de problème avec le décalage à droite qui suivant les machines décale soit des 0, soit le bit de signe.

Quote
Right shifting an unsigned quantity always fits the vacated bits with zero.
Right shifting a signed quantity will fill with bit signs (``arithmetic shift'') on some machines
and with 0-bits (``logical shift'') on others.
(extrait de The C Programming Language K&R)

Donc dans le doute des unsigned

skizoh

Un tien vaux mieux que deux tu l'auras !

osaka


alors alors, problème résolue, les solutions sont les suivante:


Suivantes ou précédentes ?  :*
Complétement Skizo.   :smiley-mr-green:

skizoh

on ce moque pas !!!! xD le principale c'est qu'il y est plus de problème ^^

Skizoooohohohoho ! :)
Un tien vaux mieux que deux tu l'auras !

Go Up