printf d'un unsigned short int et autres sorties formatées

Le
noone
Bonjour,

je suis toujours après mon microcontrôleur 8 bits ATMEL AVR 8535
(en fait je le simule avec VMLAB)

Je veux réaliser un chronomètre.

J'ai donc créé



typedef struct {
int hh; //8bits 0-255
int mm; //8bits 0-255
int ss; //8bits 0-255
unsigned short int xx; //16bits 0-65535
} time_typ;

time_typ current_time;
time_typ last_time;
time_typ best_time;

int running_chronometer = FALSE; // 0 false ; -1 true

void init_time(time_typ time) {
time.hh = 0;
time.mm = 0;
time.ss = 0;
time.xx = 0;
}

xx représente les millièmes


le problème c'est que je voudrais faire un printf pour afficher le temps.



j'ai pensé à

printf("2%i:%2i:%2i:%3l",t.hh,t.mm,t.ss,t.xx)


mais cela ne fonctionne pas pour les millièmes
(rien ne s'affiche)



j'ai également un autre problème
je voudrais que ça affiche ==:00:00:000
au lieu de 0: 0: 0: 0


savez-vous comment je dois procéder ?


Merci d'avance


PS : il n'est pas prêt de marcher mon chrono !!!!
Vos réponses Page 1 / 3
Trier par : date / pertinence
noone
Le #965110
printf("===2%i:%2i:%2i:%3l===n",t.hh,t.mm,t.ss,t.xx)
me donne

=== 0: 0: 0:==
de même que
printf("===2%i:%2i:%2i:%l===n",t.hh,t.mm,t.ss,t.xx)
printf("===2%i:%2i:%2i:%3s===n",t.hh,t.mm,t.ss,t.xx)
printf("===2%i:%2i:%2i:%s===n",t.hh,t.mm,t.ss,t.xx)

Pierre Maurette
Le #965109
printf("===2%i:%2i:%2i:%3l===n",t.hh,t.mm,t.ss,t.xx)
me donne

=== 0: 0: 0:== >
de même que
printf("===2%i:%2i:%2i:%l===n",t.hh,t.mm,t.ss,t.xx)
printf("===2%i:%2i:%2i:%3s===n",t.hh,t.mm,t.ss,t.xx)
printf("===2%i:%2i:%2i:%s===n",t.hh,t.mm,t.ss,t.xx)


Pas regardé votre printf(), mais vous devriez reprendre vos essais
avec:

void init_time(time_typ* time) {
time->hh = 0;
time->mm = 0;
time->ss = 0;
time->xx = 0;
}

--
Pierre Maurette


Eric Levenez
Le #965108
Le 15/09/06 17:45, dans «  »
typedef struct {
int hh; //8bits 0-255


"int" n'est pas 8 bits.

int mm; //8bits 0-255
int ss; //8bits 0-255
unsigned short int xx; //16bits 0-65535
} time_typ;

time_typ current_time;
time_typ last_time;
time_typ best_time;

int running_chronometer = FALSE; // 0 false ; -1 true


Autant utiliser le type boll de
void init_time(time_typ time) {


Très mauvaise idée de passer une structure en paramètre.

time.hh = 0;
time.mm = 0;
time.ss = 0;
time.xx = 0;
}

xx représente les millièmes


le problème c'est que je voudrais faire un printf pour afficher le temps.

j'ai pensé à

printf("===2%i:%2i:%2i:%3l===n",t.hh,t.mm,t.ss,t.xx)


printf("===%02d:%02d:%02d:%03hu===n", t.hh, t.mm, t.ss, t.xx)

--
Éric Lévénez -- Unix is not only an OS, it's a way of life.

Pierre Maurette
Le #965107
printf("===2%i:%2i:%2i:%3l===n",t.hh,t.mm,t.ss,t.xx)
me donne

=== 0: 0: 0:== >
de même que
printf("===2%i:%2i:%2i:%l===n",t.hh,t.mm,t.ss,t.xx)
printf("===2%i:%2i:%2i:%3s===n",t.hh,t.mm,t.ss,t.xx)
printf("===2%i:%2i:%2i:%s===n",t.hh,t.mm,t.ss,t.xx)


printf("===%2i:%2i:%2i:%3u===n",t.hh,t.mm,t.ss,t.xx);

Pensez à tester avec des valeurs moins particuliières que 0. Avec

void init_time(time_typ time) {
time.hh = 12;
time.mm = 34;
time.ss = 56;
time.xx = 123;
}

vous vous seriez rendu compte du problème de l'init_time plus
rapidement.

Faites des tests plus simples dans un premier temps, ou dans un second
temps si le premier jet ne fonctionne pas.

unsigned short test = 123;
printf("%3un",test);
puis:
printf("%3un",t.xx);
etc.

On vous dira ici qu'il ne faut pas tester jusqu'à ce que "ça semble
marcher". Ce n'est pas faux, mais tant qu'à tester, autant le faire
avec méthode.

Pour votre question précédente, il existe dans math.h la fonction
round() et ses avatars.

--
Pierre Maurette


noone
Le #965106
Pour votre question précédente, il existe dans math.h la fonction
round() et ses avatars.



merci mais elle n'existe dans la libc de avr-gcc

noone
Le #965105
void init_time(time_typ* time) {



ah ces pointeurs !!! ;-(

noone
Le #965103
Le 15/09/06 17:45, dans
typedef struct {
int hh; //8bits 0-255


"int" n'est pas 8 bits.


Ah... même sur un microcontrôleur 8 bits ?
et c'est quoi alors le type qui va de 0 à 255 et qui occupe 8 bits ?


int mm; //8bits 0-255
int ss; //8bits 0-255
unsigned short int xx; //16bits 0-65535
} time_typ;

time_typ current_time;
time_typ last_time;
time_typ best_time;

int running_chronometer = FALSE; // 0 false ; -1 true


Autant utiliser le type boll de


oui moi j'ai mis des #DEFINE pour TRUE(-1) et FALSE(0)
et puis je n'ai pas ce stdbool.h avec WinAVR (cross-compilateur pour
ATMEL AVR sous Windows)


void init_time(time_typ time) {


Très mauvaise idée de passer une structure en paramètre.



oui la bonne idée c'est de passer un pointeur sur cette structure...

merci


Pierre Maurette
Le #964928
Bonjour,

je suis toujours après mon microcontrôleur 8 bits ATMEL AVR 8535
(en fait je le simule avec VMLAB)
[...]

typedef struct {
int hh; //8bits 0-255
int mm; //8bits 0-255
int ss; //8bits 0-255
unsigned short int xx; //16bits 0-65535
} time_typ;


Il vous faut regarder dans votre documentation les types entiers de
votre implémentation. Si vous avez juste quelques instances de time_typ
à gérer, vous pouvez déclarer les quatre champs en int, ou mieux
unsigned.
Si la mémoire est un problème, vous optimisez dans ce sens selon votre
documentation. Par exemple, en C99:


#include #include
typedef struct {
uint8_t hh; //8bits 0-255
uint8_t mm; //8bits 0-255
uint8_t ss; //8bits 0-255
uint16_t xx; //16bits 0-65535
} time_typ;

time_typ current_time;
time_typ last_time;
time_typ best_time;

int running_chronometer = 0; // 0 false ; -1 true

void init_time(time_typ* time) {
time->hh = 1;
time->mm = 34;
time->ss = 56;
time->xx = 9;
}

int main(void)
{
time_typ t;
init_time(&t);
printf("===%02u:%02u:%02u:%03u===n",t.hh,t.mm,t.ss,t.xx);
return 0;
}


On pourrait également utiliser uint_fast8_t et uint_fast16_t.

Pensez à vérifier en imprimant le sizeof de votre structure qu'il
n'existe pas un ordre de déclaration des champs offrant moins de
padding. Je ne crois pas que ça puisse être le cas ici.

Si vous êtes vraiment charrette en mémoire, votez du coté des
bitfields.

--
Pierre Maurette

Pierre Maurette
Le #964927
Le 15/09/06 17:45, dans
typedef struct {
int hh; //8bits 0-255


"int" n'est pas 8 bits.


Ah... même sur un microcontrôleur 8 bits ?


En tous cas, sizeof(int) >= sizeof(short).

et c'est quoi alors le type qui va de 0 à 255 et qui occupe 8 bits ?


En C99, ce serait uint8_t de stdint.h. Si ça n'existe pas pour vous, il
vous faut, après lecture de votre documentation, identifier ou créer
les types correspondant à vos besoins et aux contraintes de votre
hardware.

--
Pierre Maurette



Publicité
Poster une réponse
Anonyme