sprintf (et presque 99.9% des fonctions de la libc) est prise en charge par le compilateur/l'ide arduino.
Pour cette ligne :
int n = (trame,"%d;%d;%d",cosinus,sinus,cosinus);
Dans n ce trouve le nombre de caractères de trame (ou 0 si la fonction plante), ok pas de probléme.
Mais là ou je pense que cela bug c'est l'utilisation de %d ! Pour un long ça devrait être un %ld !?
Tente :
int n = (trame,"%ld;%ld;%ld",cosinus,sinus,cosinus);
Tente :
int n = (trame,"%ld;%ld;%ld",cosinus,sinus,cosinus);
le résultat est encore plus troublant:
19595264;-62521344;19660799
On ne devrait rien avoir au dessus de 1000
Les deux valeurs affichées du même "cosinus" sont encore différentes
Avant d'écrire
long sinus = sin(Theta)*1000;
long cosinus = cos(Theta)*1000;
j'avais voulu utiliser des float avec l'option /3f et je n'avais obtenu que des ?
si sprintf est prise en charge par le compilateur, elle ne fonctionne pas ici comme comme à mon habitude, ou bien j'ai fait une grosse bêtise (d'où le titre),et je ne vois pas où!
La taille du tableau "trame" n'est pas suffisante, dans le pire des cas la chaîne dépasse les 12 caractères. Il faut donc dimensionner correctement le tableau. Ensuite l'utilisation de sprintf ne prenant pas en compte la taille, la mémoire est corrompue. Pour plus de sécurité, il faut privilégier l'utilisation de snprintf.
Enfin comme l'écrit Skywodd, il est préférable d'utiliser des %ld pour formater les valeurs...
À force de bidouiller j'avais accumulé les bugs.
Vous avez raison, c'est bien Long et %d qui étaient incompatibles.
Ce qui m'a surpris, c'est de ne pas m'être fait jeter par le compilateur.
La taille du tableau "trame" n'est pas suffisante, dans le pire des cas la chaîne dépasse les 12 caractères
cos(Theta)*1000 entier ne peut pas faire plus que 5 caractères (-1000) *3 =15 + 2';' = 17 caractères.
Dans ce cas, Trame[16] devrait suffire, ou je me trompe?
Le compilateur lève juste un warning, mais comme l'IDE Arduino compile avec l'option -w tu ne l'as pas vu :
On peut changer cette option, où bien il faut compiler avec gcc?
La taille du tableau "trame" n'est pas suffisante, dans le pire des cas la chaîne dépasse les 12 caractères
cos(Theta)*1000 entier ne peut pas faire plus que 5 caractères (-1000) *3 =15 + 2';' = 17 caractères.
Dans ce cas, Trame[16] devrait suffire, ou je me trompe?
Là tu n'accordes que 16 octets. Hors tu peux avoir au maximum 17 octets + le caractère de fin de chaîne '\0'. Donc il te faut Trame[18]...
patsol:
Le compilateur lève juste un warning, mais comme l'IDE Arduino compile avec l'option -w tu ne l'as pas vu :
On peut changer cette option, où bien il faut compiler avec gcc?
Je ne sais pas si on peut changer les flags de compilation tout en conservant l'IDE Arduino, en tout cas je n'ai pas trouvé...