bonjours,
j'ai un entier compris entre 0 et 4095
=> comment faire pour le convertir en une chaine de caractère qui fasse toujours 4 caractères ?
ex : 1 => "0001"
Version imprimable
bonjours,
j'ai un entier compris entre 0 et 4095
=> comment faire pour le convertir en une chaine de caractère qui fasse toujours 4 caractères ?
ex : 1 => "0001"
:DCode:printf ( "%04d", nb );
Citation:
Envoyé par Emcy
Code:
1
2 sprintf(chaine, "%04d", nb);
j'ai le code suivant :
=> j'ai le message d'avertissement :Code:sprintf((char*)&chaine_debug, "%04d", TabVLAN_Filter[myRow].ID);
les définitions des variables sont :Citation:
type qualifier mismatch in assignment
Code:
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 extern char chaine_debug[70]; // variable global static unsigned char myRow; // variable locale // ******** structure VLAN Filter ******************** typedef struct _StructA { unsigned int Enb:1; unsigned int Member:5; unsigned int NU:2; // bits non utilisés } StructA; typedef struct _StructB { unsigned int Priority:3; unsigned int Tagged:5; } StructB; typedef struct _StructVLAN { unsigned int ID; StructA A; StructB B; } StructVLAN; extern StructVLAN TabVLAN_Filter[16]; // variable global // ***************************************************
Code:sprintf(chaine_debug, "%04d", TabVLAN_Filter[myRow].ID);
c'est vrai que j'ai fait une erruer sur ce point mais j'ai toujours le meme message d'erreur...
Le & devant un nom de tableau n'est pas utilisé normalement, cependant ce n'est pas une erreur et &a signifie a si a est un tableau.Citation:
Envoyé par souviron34
Etes-vous bien sûr que l'erreur est sur cette ligne, car il n'y a pas vraiment d'assignment explicite sur cette ligne.Citation:
Envoyé par Emcy
lorsque je mets lal igne en commentaire, je n'ai plus d'erreur.
Remarque : je programme sur un petit micro-controlleur (PIC18F)
... mais je doute que ça change grand choseCode:sprintf(chaine_debug, "%04u", TabVLAN_Filter[myRow].ID);
ça ne change rien au message d'erreur...
Je suis désolé, je ne vois pas d'erreur sur cette ligne.Citation:
Envoyé par Emcy
sinon vous ne savez pas comment faire une fonction qui fait la transformation que je recherche ?
Normalement, sprintf() doit fonctionner sur toute implémentation standard. Sinon, il vous reste toujours itoa() (<stdlib.h>).Citation:
Envoyé par Emcy
Pas forcément sur des systèmes avec des micro-controlleur et peu de mémoire.Citation:
Envoyé par stephl
Il est souvent nécessaire de choisir le modèle de mèmoire correct.
Emcy: Quel modèle de mémoire as-tu choisi pour la compilation de ton programme?
c'est quoi un modèle de memoire ? je n'en ai jamais entendu parlé ...
finalement, j'ai touvé :
donc j'ai :
- Code Model : Small Code Model (<=64K bytes)
- Data Model : Large Data Model (all RAM Bank)
- Stack Model : Single-bank model
remarque : itoa fonctionne...
Je ne suis pas un gourou dans des "petits systèmes".
Mais j'ai remarqué que certaines fonctions standard comme printf, sprintf et autres ne fonctionnent que sous certaines modèles de mémoire.
Il faut lire la documentation de ton compilateur et de ton système.
d'accord, je vais regarder ça de plus près...
Alors utilisez itoa() qui est spécifique aux conversions entier -> chaîne, plutôt que sprintf() qui est un arsenal bien lourd pour cette simple conversion.Citation:
Envoyé par Emcy
et comment fait-on pour insérer des 0 (vu que je veux qu'il y ai toujour 4 chiffres d'affichés)
j'ai utilisé cette methode (pas encore testée) : n'est-elle pas un peu lourde ?
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 itoa(TabVLAN_Filter[myRow].ID, StringTemp); j = 4; k=0; while (StringTemp[j]!='\0') { chaine_debug[k++] = '0'; } l = 0; for ( j = k; j < 5; j++ ){ chaine_debug[j] = StringTemp[l++]; }
Excusez-moi, j'avais oublié ce détail.Citation:
Envoyé par Emcy
Le mieux est encore de créer votre propre fonction de conversion, soit en supposant qu'il n'y aura jamais plus de 4 chiffres et que l'on veut une conversion en décimal (et que le nombre est positif):Citation:
Envoyé par Emcy
Code:
1
2
3
4
5
6
7
8
9
10
11
12 char *itoa4(int i,char *s) { int j; s[4]=0; for (j=3;j>=0;--j) { s[j]=i%10+'0'; i/=10; } return s; }
Citation:
Envoyé par Emcy
Code:
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
31
32
33 /* myiota: converts an int in [0,4095] range into a 4 chars string left filled with 0 *outstr should points on a string buffer of at least 5 chars */ void myitoa(unsigned short num,char *outstr) { #define BASE (10) int q, r ; char *s = outstr + 3 ; outstr[0] = '0' ; outstr[1] = '0' ; outstr[2] = '0' ; outstr[3] = '?' ; outstr[4] = '\0' ; if (num > 4095) return ; do { r = num % BASE ; q = num / BASE ; *s-- = r + '0' ; num = q ; } while (num) ; #undef BASE }
Citation:
Envoyé par Emcy
Code:
1
2
3 char chaine[5]; sprintf (chaine, "%04u", entier_non_signe);
Citation:
Envoyé par Emcy
Faut pas chercher des trucs tordus ou compliqués...Code:sprintf(chaine_debug, "%04u", TabVLAN_Filter[myRow].ID);
Si, c'est une erreur de compréhension du langage C. C'est grave.Citation:
Envoyé par stephl
- a désigne un tableau de N éléments de type T. Il a pour valeur l'adresse du premier élément du tableau. Il a pour type T*.
- &a est l'adresse du tableau. Il a certes la même valeur que a mais le type est différent : T(*)[N]. (EDIT)
si jamais a est un pointeur, c'est le drame.
Donc pas de &.
Cette fonction n'est pas standard.Citation:
Envoyé par stephl
http://emmanuel-delahaye.developpez....theque-clib-c/
Module ITOA
C'est tout à fait possible.Citation:
Envoyé par jowo
Quel message d'erreur ? Tu as parlé d'un warning...Citation:
Envoyé par Emcy
OK pour moi :Citation:
Envoyé par JeitEmgie
Code:
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84 /* myiota: converts an int in [0,4095] range into a 4 chars string left filled with 0 *outstr should points on a string buffer of at least 5 chars */ void myitoa(unsigned short num,char *outstr) { #define BASE (10) int q, r ; char *s = outstr + 3 ; outstr[0] = '0' ; outstr[1] = '0' ; outstr[2] = '0' ; outstr[3] = '?' ; outstr[4] = '\0' ; if (num > 4095) return ; do { r = num % BASE ; q = num / BASE ; *s-- = r + '0' ; num = q ; } while (num) ; #undef BASE } #ifdef TEST #include <stdio.h> #include <string.h> int main (void) { struct test { int n; int val; char const *s; int ret; }; static const struct test a[]= { {10, 0, "0000", 0}, {11, 4095, "4095", 0}, {20, 4096, "000?", 0}, {20, -1 , "000?", 0}, }; size_t i; #define N(a) (sizeof(a)/sizeof*(a)) for (i=0; i < N(a); i++) { struct test const *p = a + i; char s[8] = "********"; myitoa(p->val, s); if (strcmp (s, p->s) != 0) { printf ("ERR at test %d\n", p->n); break; } } if (i == N(a)) { puts ("P A S S E D"); } return 0; } #endif
Code:
1
2
3
4P A S S E D Press ENTER to continue.
merci pour votre aide active ;)
donc je vais prendre la solution de JeitEmgie
On m'a dit que ça viendrait du compilo (certains compilo gère mal le standard : ça doit être mon cas)
par contre ça sert à quoi de mettre de #define dans la fonction ? il n'existe pas un moyen plus effcace pour convertir un nombre binaire en nombre decimal ASCII ?
D'accord, c'est mal comprendre ce qu'est un tableau; je voulais juste préciser que ce n'était pas une erreur dans ce cas et que la valeur était la même avec ou sans &. Cependant, je suis d'accord qu'il n'est pas logique d'écrire & devant un nom de tableau.Citation:
Envoyé par Emmanuel Delahaye
On est d'accord.Citation:
a désigne un tableau de N éléments de type T. Il a pour valeur l'adresse du premier élément du tableau. Il a pour type T*.
&a a exactement la même valeur que a. Le type que vous lui donnez n'a aucun sens: (T *nom_type)[N] n'est pas valide.Citation:
&a est l'adresse du tableau. Il a certes la même valeur que a mais le type est différent : (T*)[N].
D'accord, mais ici il s'agit de tableaux et j'ai juste voulu indiquer que ce n'était pas là qu'il fallait chercher l'erreur.Citation:
si jamais a est un pointeur, c'est le drame.
Tout à fait d'accord. C'est illogique, mais ça ne génère pas d'erreur.Citation:
Donc pas de &.
Et pourtant Emmanuel a raison. Soit le tableau:Citation:
Envoyé par stephl
ou t représente un type quelconque. La différence entre entre tableau et &tableau, c'est le type! tableau est une expression de type pointeur-sur-T, alors que &tableau est de type pointeur-sur-tableau-de-T i.e T (*)[]. La FAQ de comp.lang.c http://c-faq.com/aryptr/aryvsadr.html confirme cette information.Code:T tableau[50];
Thierry
EDIT : Exact, ce n'est pas du C. Ceci est valide :Citation:
Envoyé par stephl
Code:T (*p_tab)[N];
Mais ça génère un warning.Citation:
Tout à fait d'accord. C'est illogique, mais ça ne génère pas d'erreur.
http://emmanuel-delahaye.developpez....-codage-c/#LVI
Faux, pointeur sur pointeur sur T, ou alors vous avez laissé trainer une '*' par inadvertance.Citation:
Envoyé par mujigka
D'accord si tableau est défini par T tableau[50]. D'ailleurs, vous avez corrigé l'erreur de vous-même, puisque vous avez écrit T (*)[], et non pas (T*)[N] comme Emmanuel, ce qui n'a aucun sens: (T *nom_type)[N] n'est pas valide.Citation:
alors que &tableau est de type pointeur-sur-tableau-de-T i.e T (*)[].
Oups! Merci, faute d'inattention... J'ai édité mon post. :oops:Citation:
Envoyé par stephl
Thierry
Vous aviez écrit (T*)[N] ce qui se traduit normalement par (T *nom_type)[N] et n'est pas correct. Il faut écrire T (*)[N].Citation:
Envoyé par Emmanuel Delahaye
Oué, déjà corrigé... faut suivre...Citation:
Envoyé par stephl
Votre correction date de 10h29 tout comme mon message; vous admettrez donc que je n'ai pas pu voir votre correction à temps ;) .Citation:
Envoyé par Emmanuel Delahaye
http://www.developpez.net/forums/sho...3&postcount=33Citation:
Envoyé par stephl
Dernière modification par Emmanuel Delahaye Aujourd'hui à 10h28.
http://forum-images.hardware.fr/imag...so/angefox.gif
Cela dépend de quelle correction vous parlez, car l'autre date de 10h29:Citation:
Envoyé par Emmanuel Delahaye
http://www.developpez.net/forums/sho...1&postcount=25
Et puis 1 minute d'écart, ça ne change pas grand chose. Il faut compter le temps d'actualisation du forum et mon temps d'actualisation personnel.