Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

23 réponses
Avatar
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===\n",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: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 !!!!

10 réponses

1 2 3
Avatar
noone
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)

Avatar
Pierre Maurette
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


Avatar
Eric Levenez
Le 15/09/06 17:45, dans <450acaa5$0$27379$,
«  » a écrit :

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 <stdbool.h>

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 -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.

Avatar
Pierre Maurette
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


Avatar
noone
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

Avatar
noone
void init_time(time_typ* time) {



ah ces pointeurs !!! ;-(

Avatar
noone
Avatar
noone
Le 15/09/06 17:45, dans <450acaa5$0$27379$,

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 <stdbool.h>



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


Avatar
Pierre Maurette
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 <stdio.h>
#include <stdint.h>

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

Avatar
Pierre Maurette
Le 15/09/06 17:45, dans <450acaa5$0$27379$,

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



1 2 3