je programme actuellement un microcontr=F4leur (ATMEL AVR ATmega128 avec
WinAVR gcc et VMLAB comme IDE)
J'utilise une biblioth=E8que pour utiliser un afficheur LCD caract=E8re
parall=E8le (type HD44780).
C'est la biblioth=E8que de Peter Fleury
http://homepage.hispeed.ch/peterfleury/
Elle contient par exemple la fonction tr=E8s utile
void lcd_puts(const char *s)
/* print string on lcd (no auto linefeed) */
{
register char c;
while ( (c =3D *s++) ) {
lcd_putc(c);
}
}/* lcd_puts */
donc en faisant lcd_puts("hello")
=E7a affiche hello sur le LCD.
Le probl=E8me c'est que j'ai besoin de faire des sorties format=E9es
exemple :
printf("%02i:%02i:%02i:%03u",t->hh,t->mm,t->ss,t->xx/((int)
pow(10,CHR_PRECISION-CHR_DISPLAY)));
Comment cr=E9er ma fonction propre fonction printf (disons lcd_printf) ?
Cette fonction appelerai =E9videmment lcd_puts(...)
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Pierre Maurette
Bonsoir,
je programme actuellement un microcontrôleur (ATMEL AVR ATmega128 avec WinAVR gcc et VMLAB comme IDE)
J'utilise une bibliothèque pour utiliser un afficheur LCD caractère parallèle (type HD44780). C'est la bibliothèque de Peter Fleury http://homepage.hispeed.ch/peterfleury/
Elle contient par exemple la fonction très utile
void lcd_puts(const char *s) /* print string on lcd (no auto linefeed) */ { register char c;
while ( (c = *s++) ) { lcd_putc(c); }
}/* lcd_puts */
donc en faisant lcd_puts("hello") ça affiche hello sur le LCD.
Le problème c'est que j'ai besoin de faire des sorties formatées
exemple : printf("%02i:%02i:%02i:%03u",t->hh,t->mm,t->ss,t->xx/((int) pow(10,CHR_PRECISION-CHR_DISPLAY)));
Comment créer ma fonction propre fonction printf (disons lcd_printf) ? Cette fonction appelerai évidemment lcd_puts(...)
Vous utilisez sprintf(), par exemple ?
-- Pierre Maurette
Bonsoir,
je programme actuellement un microcontrôleur (ATMEL AVR ATmega128 avec
WinAVR gcc et VMLAB comme IDE)
J'utilise une bibliothèque pour utiliser un afficheur LCD caractère
parallèle (type HD44780).
C'est la bibliothèque de Peter Fleury
http://homepage.hispeed.ch/peterfleury/
Elle contient par exemple la fonction très utile
void lcd_puts(const char *s)
/* print string on lcd (no auto linefeed) */
{
register char c;
while ( (c = *s++) ) {
lcd_putc(c);
}
}/* lcd_puts */
donc en faisant lcd_puts("hello")
ça affiche hello sur le LCD.
Le problème c'est que j'ai besoin de faire des sorties formatées
exemple :
printf("%02i:%02i:%02i:%03u",t->hh,t->mm,t->ss,t->xx/((int)
pow(10,CHR_PRECISION-CHR_DISPLAY)));
Comment créer ma fonction propre fonction printf (disons lcd_printf) ?
Cette fonction appelerai évidemment lcd_puts(...)
je programme actuellement un microcontrôleur (ATMEL AVR ATmega128 avec WinAVR gcc et VMLAB comme IDE)
J'utilise une bibliothèque pour utiliser un afficheur LCD caractère parallèle (type HD44780). C'est la bibliothèque de Peter Fleury http://homepage.hispeed.ch/peterfleury/
Elle contient par exemple la fonction très utile
void lcd_puts(const char *s) /* print string on lcd (no auto linefeed) */ { register char c;
while ( (c = *s++) ) { lcd_putc(c); }
}/* lcd_puts */
donc en faisant lcd_puts("hello") ça affiche hello sur le LCD.
Le problème c'est que j'ai besoin de faire des sorties formatées
exemple : printf("%02i:%02i:%02i:%03u",t->hh,t->mm,t->ss,t->xx/((int) pow(10,CHR_PRECISION-CHR_DISPLAY)));
Comment créer ma fonction propre fonction printf (disons lcd_printf) ? Cette fonction appelerai évidemment lcd_puts(...)
Vous utilisez sprintf(), par exemple ?
-- Pierre Maurette
noone
Comment créer ma propre fonction printf (disons lcd_printf) ? Cette fonction appelerai évidemment lcd_puts(...)
Vous utilisez sprintf(), par exemple ?
merci pour sprintf (que je n'ai jamais utilisé)
mais comment faire pour créer ma fonction lcd_printf qui prend les même arguments que printf (en nombre variable) et qui contient une initialisation de la chaine tampon (de quelle taille d'ailleurs ?) ainsi qu'un appel de lcd_puts(tampon)
Comment créer ma propre fonction printf (disons lcd_printf) ?
Cette fonction appelerai évidemment lcd_puts(...)
Vous utilisez sprintf(), par exemple ?
merci pour sprintf (que je n'ai jamais utilisé)
mais comment faire pour créer ma fonction lcd_printf
qui prend les même arguments que printf (en nombre variable)
et qui contient une initialisation de la chaine tampon (de quelle
taille d'ailleurs ?)
ainsi qu'un appel de lcd_puts(tampon)
Comment créer ma propre fonction printf (disons lcd_printf) ? Cette fonction appelerai évidemment lcd_puts(...)
Vous utilisez sprintf(), par exemple ?
merci pour sprintf (que je n'ai jamais utilisé)
mais comment faire pour créer ma fonction lcd_printf qui prend les même arguments que printf (en nombre variable) et qui contient une initialisation de la chaine tampon (de quelle taille d'ailleurs ?) ainsi qu'un appel de lcd_puts(tampon)
Eric Levenez
Le 23/09/06 20:40, dans , « » a écrit :
mais comment faire pour créer ma fonction lcd_printf qui prend les même arguments que printf (en nombre variable) et qui contient une initialisation de la chaine tampon (de quelle taille d'ailleurs ?) ainsi qu'un appel de lcd_puts(tampon)
-- Éric Lévénez -- <http://www.levenez.com/> Unix is not only an OS, it's a way of life.
Le 23/09/06 20:40, dans
<1159036840.046346.241810@h48g2000cwc.googlegroups.com>,
« noone@nowhere.undef » <s.celles@gmail.com> a écrit :
mais comment faire pour créer ma fonction lcd_printf
qui prend les même arguments que printf (en nombre variable)
et qui contient une initialisation de la chaine tampon (de quelle
taille d'ailleurs ?)
ainsi qu'un appel de lcd_puts(tampon)
mais comment faire pour créer ma fonction lcd_printf qui prend les même arguments que printf (en nombre variable) et qui contient une initialisation de la chaine tampon (de quelle taille d'ailleurs ?) ainsi qu'un appel de lcd_puts(tampon)
Que se passe-t'il si on dépasse les 79 caractères + ?
il y a quelque chose d'améliorable là dedans...
si printf ne contient qu'un seul paramètre (la chaine de caractère) exemple : printf("hello") lcd_printf() devrait directement appeler lcd_putc(c) sans avoir besoin de réserver
char tmp[80];
pour un microcontrôleur ça peut avoir son importance... non ?
le problème c'est que je ne sais comment récupérer ce nombre de paramètre (je ne suis pas habitué au paramètre "..."
Merci encore (vous m'avez fait économiser un temps précieux ;-) )
Que se passe-t'il si on dépasse les 79 caractères + ?
il y a quelque chose d'améliorable là dedans...
si printf ne contient qu'un seul paramètre (la chaine de caractère)
exemple : printf("hello")
lcd_printf() devrait directement appeler lcd_putc(c) sans avoir besoin
de réserver
char tmp[80];
pour un microcontrôleur ça peut avoir son importance... non ?
le problème c'est que je ne sais comment récupérer ce nombre de
paramètre (je ne suis pas habitué au paramètre "..."
Merci encore (vous m'avez fait économiser un temps précieux ;-) )
Que se passe-t'il si on dépasse les 79 caractères + ?
il y a quelque chose d'améliorable là dedans...
si printf ne contient qu'un seul paramètre (la chaine de caractère) exemple : printf("hello") lcd_printf() devrait directement appeler lcd_putc(c) sans avoir besoin de réserver
char tmp[80];
pour un microcontrôleur ça peut avoir son importance... non ?
le problème c'est que je ne sais comment récupérer ce nombre de paramètre (je ne suis pas habitué au paramètre "..."
Merci encore (vous m'avez fait économiser un temps précieux ;-) )
Que se passe-t'il si on dépasse les 79 caractères + ?
"vsnprintf" retourne normalement la taille écrite dans le buffer (hors le 0). En cas de débordement, il va retourner la taille qu'il aurait eu besoin, mais il n'aura rien écrit. Il suffit donc de tester le code de retour de vsnprintf par rapport à la taille du buffer pour tester ce cas.
ret = vsnprintf(tmp, sizeof tmp, msg, ap); it (ret >= sizeof tmp) erreur();
Mais dans ton cas ou tu connais la taille de ton affichage LCD et la taille que tu veux afficher, cela ne devrait pas poser de problème.
-- Éric Lévénez -- <http://www.levenez.com/> Unix is not only an OS, it's a way of life.
Le 23/09/06 21:22, dans
<1159039333.384456.180180@e3g2000cwe.googlegroups.com>,
« noone@nowhere.undef » <s.celles@gmail.com> a écrit :
Que se passe-t'il si on dépasse les 79 caractères + ?
"vsnprintf" retourne normalement la taille écrite dans le buffer (hors le
0). En cas de débordement, il va retourner la taille qu'il aurait eu besoin,
mais il n'aura rien écrit. Il suffit donc de tester le code de retour de
vsnprintf par rapport à la taille du buffer pour tester ce cas.
ret = vsnprintf(tmp, sizeof tmp, msg, ap);
it (ret >= sizeof tmp)
erreur();
Mais dans ton cas ou tu connais la taille de ton affichage LCD et la taille
que tu veux afficher, cela ne devrait pas poser de problème.
--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.
Que se passe-t'il si on dépasse les 79 caractères + ?
"vsnprintf" retourne normalement la taille écrite dans le buffer (hors le 0). En cas de débordement, il va retourner la taille qu'il aurait eu besoin, mais il n'aura rien écrit. Il suffit donc de tester le code de retour de vsnprintf par rapport à la taille du buffer pour tester ce cas.
ret = vsnprintf(tmp, sizeof tmp, msg, ap); it (ret >= sizeof tmp) erreur();
Mais dans ton cas ou tu connais la taille de ton affichage LCD et la taille que tu veux afficher, cela ne devrait pas poser de problème.
-- Éric Lévénez -- <http://www.levenez.com/> Unix is not only an OS, it's a way of life.
Eric Levenez
Le 23/09/06 21:43, dans , « » a écrit :
vsnprintf(tmp, sizeof tmp, msg, ap);
il y a quelque chose d'améliorable là dedans...
si printf ne contient qu'un seul paramètre (la chaine de caractère) exemple : printf("hello") lcd_printf() devrait directement appeler lcd_putc(c) sans avoir besoin de réserver
char tmp[80];
pour un microcontrôleur ça peut avoir son importance... non ?
La taille est dans la pile (enfin normalement), donc allouée et libérée dynamiquement. De toute façon vsnprintf est une grosse fonction (en taille), et si tu l'utilises en embarqué, alors la taille de tmp est négligeable.
Si tu veux faire bien les choses, alors il faut allouer dynamiquement le buffer en appelant une première fois vsnprintf avec une taille de 0. Tu alloues ensuite la taille retournée + 1 pour le 0. Et enfin tu appelles une seconde fois vsnprintf avec la taille que tu viens d'allouer. Ensuite tu libère le buffer alloué.
le problème c'est que je ne sais comment récupérer ce nombre de paramètre (je ne suis pas habitué au paramètre "..."
Ce n'est pas les arguments variables qui importent ici, mais la façon dont printf traite ses arguments. Il suffit donc de compter le nombre de % (non suivi d'un second %) pour connaître le nombre d'arguments.
-- Éric Lévénez -- <http://www.levenez.com/> Unix is not only an OS, it's a way of life.
Le 23/09/06 21:43, dans
<1159040603.297651.50220@i42g2000cwa.googlegroups.com>,
« noone@nowhere.undef » <s.celles@gmail.com> a écrit :
vsnprintf(tmp, sizeof tmp, msg, ap);
il y a quelque chose d'améliorable là dedans...
si printf ne contient qu'un seul paramètre (la chaine de caractère)
exemple : printf("hello")
lcd_printf() devrait directement appeler lcd_putc(c) sans avoir besoin
de réserver
char tmp[80];
pour un microcontrôleur ça peut avoir son importance... non ?
La taille est dans la pile (enfin normalement), donc allouée et libérée
dynamiquement. De toute façon vsnprintf est une grosse fonction (en taille),
et si tu l'utilises en embarqué, alors la taille de tmp est négligeable.
Si tu veux faire bien les choses, alors il faut allouer dynamiquement le
buffer en appelant une première fois vsnprintf avec une taille de 0. Tu
alloues ensuite la taille retournée + 1 pour le 0. Et enfin tu appelles une
seconde fois vsnprintf avec la taille que tu viens d'allouer. Ensuite tu
libère le buffer alloué.
le problème c'est que je ne sais comment récupérer ce nombre de
paramètre (je ne suis pas habitué au paramètre "..."
Ce n'est pas les arguments variables qui importent ici, mais la façon dont
printf traite ses arguments. Il suffit donc de compter le nombre de % (non
suivi d'un second %) pour connaître le nombre d'arguments.
--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.
si printf ne contient qu'un seul paramètre (la chaine de caractère) exemple : printf("hello") lcd_printf() devrait directement appeler lcd_putc(c) sans avoir besoin de réserver
char tmp[80];
pour un microcontrôleur ça peut avoir son importance... non ?
La taille est dans la pile (enfin normalement), donc allouée et libérée dynamiquement. De toute façon vsnprintf est une grosse fonction (en taille), et si tu l'utilises en embarqué, alors la taille de tmp est négligeable.
Si tu veux faire bien les choses, alors il faut allouer dynamiquement le buffer en appelant une première fois vsnprintf avec une taille de 0. Tu alloues ensuite la taille retournée + 1 pour le 0. Et enfin tu appelles une seconde fois vsnprintf avec la taille que tu viens d'allouer. Ensuite tu libère le buffer alloué.
le problème c'est que je ne sais comment récupérer ce nombre de paramètre (je ne suis pas habitué au paramètre "..."
Ce n'est pas les arguments variables qui importent ici, mais la façon dont printf traite ses arguments. Il suffit donc de compter le nombre de % (non suivi d'un second %) pour connaître le nombre d'arguments.
-- Éric Lévénez -- <http://www.levenez.com/> Unix is not only an OS, it's a way of life.
Pierre Maurette
Comment créer ma propre fonction printf (disons lcd_printf) ? Cette fonction appelerai évidemment lcd_puts(...)
Vous utilisez sprintf(), par exemple ?
merci pour sprintf (que je n'ai jamais utilisé)
mais comment faire pour créer ma fonction lcd_printf qui prend les même arguments que printf (en nombre variable) et qui contient une initialisation de la chaine tampon (de quelle taille d'ailleurs ?) ainsi qu'un appel de lcd_puts(tampon)
Pourquoi dans votre contexte faire une "belle" fonction lcd_printf(const char* format, ...) ? Il me semble que vous allez gaspiller de la ressource, sans nécessairement vous simplifier la programmation. Avec un afficheur LCD, vous êtes obligé de contrôler précisément ce que vous envoyez à l'affichage(*). Vous savez afficher un caractère, vous savez afficher une chaîne. Il vous reste à obtenir une chaîne formatée. La taille du buffer n'est-elle pas déterminée par les caractéristiques de l'afficheur (ajouter le ' ' quand même) ? Pourquoi ne pas réserver cette mémoire une fois pour toute en static, dans la mémoire la moins "chère" ? A partir de là, vous auriez soit des: lcd_puts(const char*); soit des: sprintf(staticBouffeur, etc.); lcd_puts(bouffeur); Vous pourriez faire une macro PRINTF(), mais je ne vois pas l'avantage d'une telle obfuscation.
(*) C'est éventuellement faux dans le cas où vous gèreriez un buffer et des touches de défilement.
-- Pierre Maurette
Comment créer ma propre fonction printf (disons lcd_printf) ?
Cette fonction appelerai évidemment lcd_puts(...)
Vous utilisez sprintf(), par exemple ?
merci pour sprintf (que je n'ai jamais utilisé)
mais comment faire pour créer ma fonction lcd_printf
qui prend les même arguments que printf (en nombre variable)
et qui contient une initialisation de la chaine tampon (de quelle
taille d'ailleurs ?)
ainsi qu'un appel de lcd_puts(tampon)
Pourquoi dans votre contexte faire une "belle" fonction
lcd_printf(const char* format, ...) ? Il me semble que vous allez
gaspiller de la ressource, sans nécessairement vous simplifier la
programmation.
Avec un afficheur LCD, vous êtes obligé de contrôler précisément ce que
vous envoyez à l'affichage(*). Vous savez afficher un caractère, vous
savez afficher une chaîne. Il vous reste à obtenir une chaîne formatée.
La taille du buffer n'est-elle pas déterminée par les caractéristiques
de l'afficheur (ajouter le ' ' quand même) ? Pourquoi ne pas réserver
cette mémoire une fois pour toute en static, dans la mémoire la moins
"chère" ?
A partir de là, vous auriez soit des:
lcd_puts(const char*);
soit des:
sprintf(staticBouffeur, etc.);
lcd_puts(bouffeur);
Vous pourriez faire une macro PRINTF(), mais je ne vois pas l'avantage
d'une telle obfuscation.
(*) C'est éventuellement faux dans le cas où vous gèreriez un buffer et
des touches de défilement.
Comment créer ma propre fonction printf (disons lcd_printf) ? Cette fonction appelerai évidemment lcd_puts(...)
Vous utilisez sprintf(), par exemple ?
merci pour sprintf (que je n'ai jamais utilisé)
mais comment faire pour créer ma fonction lcd_printf qui prend les même arguments que printf (en nombre variable) et qui contient une initialisation de la chaine tampon (de quelle taille d'ailleurs ?) ainsi qu'un appel de lcd_puts(tampon)
Pourquoi dans votre contexte faire une "belle" fonction lcd_printf(const char* format, ...) ? Il me semble que vous allez gaspiller de la ressource, sans nécessairement vous simplifier la programmation. Avec un afficheur LCD, vous êtes obligé de contrôler précisément ce que vous envoyez à l'affichage(*). Vous savez afficher un caractère, vous savez afficher une chaîne. Il vous reste à obtenir une chaîne formatée. La taille du buffer n'est-elle pas déterminée par les caractéristiques de l'afficheur (ajouter le ' ' quand même) ? Pourquoi ne pas réserver cette mémoire une fois pour toute en static, dans la mémoire la moins "chère" ? A partir de là, vous auriez soit des: lcd_puts(const char*); soit des: sprintf(staticBouffeur, etc.); lcd_puts(bouffeur); Vous pourriez faire une macro PRINTF(), mais je ne vois pas l'avantage d'une telle obfuscation.
(*) C'est éventuellement faux dans le cas où vous gèreriez un buffer et des touches de défilement.
-- Pierre Maurette
noone
Pourquoi dans votre contexte faire une "belle" fonction lcd_printf(const char* format, ...) ?
Parce que je trouve élégant de remplacer mes printf qui m'ont servi à tester mon code par des lcd_printf
C'est à priori la seule raison
Merci à tous les deux
Pourquoi dans votre contexte faire une "belle" fonction lcd_printf(const
char* format, ...) ?
Parce que je trouve élégant de remplacer mes printf qui m'ont servi à
tester mon code par des lcd_printf