Pages: [1]   Go Down
Author Topic: [résolue] variable long dépassement, cast mal appliqué  (Read 711 times)
0 Members and 1 Guest are viewing this topic.
83 - var
Offline Offline
God Member
*****
Karma: 9
Posts: 864
ARDUINO Powa !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 !
« Last Edit: May 03, 2012, 06:41:43 am by skizoh » Logged

Un tien vaux mieux que deux tu l'auras !

France
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3626
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

83 - var
Offline Offline
God Member
*****
Karma: 9
Posts: 864
ARDUINO Powa !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

envoie:
Code:

    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:
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 !
« Last Edit: May 03, 2012, 04:50:11 am by skizoh » Logged

Un tien vaux mieux que deux tu l'auras !

France
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3626
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
modif_para_ronde[12]=(byte)(stop_ronde>>24);

Quote
stop_ronde=((reception[12]<<24)+((reception[13]& 0xFF)<<16)+((reception[14]& 0xFF)<<smiley-cool+(reception[15]& 0xFF))*1000;
Je crois comprendre que reception est un tableau de byte donc convertir en unsigned long avant de décaler.
Code:
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
« Last Edit: May 03, 2012, 06:30:53 am by fdufnews » Logged

83 - var
Offline Offline
God Member
*****
Karma: 9
Posts: 864
ARDUINO Powa !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 !
Logged

Un tien vaux mieux que deux tu l'auras !

83 - var
Offline Offline
God Member
*****
Karma: 9
Posts: 864
ARDUINO Powa !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Je pense que ce que tu voulais faire c'était plutôt ça;
Code:
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:
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:
modif_para_ronde[12]=byte(stop_ronde>>24);

et

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

voilou smiley merci beaucoup fdufnews :p

Vite fait bien fait =)

Skizo !
Logged

Un tien vaux mieux que deux tu l'auras !

France
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3626
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

83 - var
Offline Offline
God Member
*****
Karma: 9
Posts: 864
ARDUINO Powa !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok ok, merci de ton aide.

Skizo !
Logged

Un tien vaux mieux que deux tu l'auras !

Made in Belgium
Offline Offline
God Member
*****
Karma: 1
Posts: 756
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Suivantes ou précédentes ?  smiley-kiss
Complétement Skizo.   smiley-mr-green
Logged


83 - var
Offline Offline
God Member
*****
Karma: 9
Posts: 864
ARDUINO Powa !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Skizoooohohohoho ! smiley
Logged

Un tien vaux mieux que deux tu l'auras !

Pages: [1]   Go Up
Jump to: