Bonjour à tous,
J'aurais besoin de convertir un signed long en tableau de caractères, mais sans aucune bibliothèque car je travaille sur de l'embarqué.
Merci d'avance !
Bonjour à tous,
J'aurais besoin de convertir un signed long en tableau de caractères, mais sans aucune bibliothèque car je travaille sur de l'embarqué.
Merci d'avance !
my_itoa :
- trouver le signe (+ ou -)
- récupérer l'ordre de grandeur en base 10 de la valeur absolue (cpt = 0; tant que nombre > 0 faire un div 10 et cpt++)
- allouer le nombre de cases + 1 (+1 si négatif) pour des char
- faire des modulos, s'aligner sur le code ASCII de '0', écrire la valeur dans la case correspondante du tableau
- ne pas oublier le '\0' à la fin...
Et voili voilou !
--
Metalman !
Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
(ANSI retire quelques fonctions comme strdup...)
L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
Et s'assurer que la logique est bonne "aussi" !
Ma page Developpez.net
1 minute de recherche et ... voilà !
Merci beaucoup pour ces réponses et la rapidité !
Il ne me reste plus qu'à essayer tout ça.
Malheureusement je n'arrive pas à utiliser la fonction.. Peut être que je ne l'appelle pas bien.
J'ai un booléen qui m'indique que je rentre bien dans mon traitement 'TraitemensCommandes' mais après plus rien (la LED témoin de ma carte électronique s'arrête de clignoter donc plantage du programme) et bien sûr pas de point d'arrêt pour voir ce qui se déroule dans la fonction itoa.
Ma fonction légèrement modifiée (value est un signed long et non plus un int) :
L'appel :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 char * itoa_c ( signed long value, char * result, int base ) { // check that the base if valid if ( base < 2 || base > 36 ) { *result = '\0'; return result; } char* ptr = result, *ptr1 = result, tmp_char; int tmp_value; do { tmp_value = value; value /= base; *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"[35 + (tmp_value - value * base)]; } while ( value ); // Apply negative sign if ( tmp_value < 0 ) *ptr++ = '-'; *ptr-- = '\0'; while ( ptr1 < ptr ) { tmp_char = *ptr; *ptr-- = *ptr1; *ptr1++ = tmp_char; } return result; }
slX contient à ce moment le nombre 50.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 void TraitementCommandes () { if (( cSerialCmd [0] == 'S' )&&( cSerialCmd [1] == 'T' )) { // Je suis sûr de passer la condition ci-dessus cX = itoa_c( slX, cX, 10 ); } }
cX est déclaré après les #include dans le .c :
Merci d'avance.
Code : Sélectionner tout - Visualiser dans une fenêtre à part char * cX;
cX est déclaré après les #include dans le .c :
Code : Sélectionner tout - Visualiser dans une fenêtre à part char * cX;
Ce code fait quoi? ptr vaut quoi? si ptr est juste déclaré en tant que char * sans initialisation?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 char* ptr = result, *ptr1 = result, tmp_char; int tmp_value; do { tmp_value = value; value /= base; *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"[35 + (tmp_value - value * base)]; } while ( value );
Partager