[résolue] variable long dépassement, cast mal appliqué

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 !

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.

envoie:

    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:

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 !

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;

 modif_para_ronde[12]=(byte)(stop_ronde>>24);

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.

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

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 !

fdufnews:
Je pense que ce que tu voulais faire c’était plutôt ça;

 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.

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:

 modif_para_ronde[12]=byte(stop_ronde>>24);

et

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

[/quote]

voilou :slight_smile: merci beaucoup fdufnews :stuck_out_tongue:

Vite fait bien fait =)

Skizo !

voilou smiley merci beaucoup fdufnews :stuck_out_tongue:

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.

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

ok ok, merci de ton aide.

Skizo !

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

Suivantes ou précédentes ? :*
Complétement Skizo. :grin:

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

Skizoooohohohoho ! :slight_smile: