winavr i sprintf
From: Maksymilian Dutka <maxdutka_at_nospam_usunpoczta.onet.pl>
Subject: winavr i sprintf
Date: Sat, 05 Feb 2005 18:46:37 +0100
Jest może jakaś funkcja funkcjonalnie podobna do sprintf ale nie
zjadająca tyle pamięci?
From: Jacek Czerwinski <jacek_delete_this_at_nospam_klik.rubikon.pl>
Subject: Re: winavr i sprintf
Date: Sat, 5 Feb 2005 19:58:26 +0100
Sat, 05 Feb 2005 18:46:37 +0100, na pl.misc.elektronika, Maksymilian Dutka
napisał(a):
Jest może jakaś funkcja funkcjonalnie podobna do sprintf ale nie
zjadająca tyle pamięci?
Na ile podobna ?
Niektóre biblioteki mają chudsze odpwoiedniki (*)printf, pytanie bez czego:
bez floata (mówie o dużych kompach), bez longów ....
Soursy biblioteki czy są dostępne ?
Ok 1987 robile chudego sprintfa na PC (256kb) więc kibicuje podbnym
rozwizaniom.
From: Maksymilian Dutka <maxdutka_at_nospam_usunpoczta.onet.pl>
Subject: Re: winavr i sprintf
Date: Sat, 05 Feb 2005 20:04:43 +0100
Jacek Czerwinski napisał(a):
Sat, 05 Feb 2005 18:46:37 +0100, na pl.misc.elektronika, Maksymilian Dutka
napisał(a):
Jest może jakaś funkcja funkcjonalnie podobna do sprintf ale nie
zjadająca tyle pamięci?
Na ile podobna ?
Wystarczy mi tylko: %s,%i bez dodatkowych opcji formatujących.
From: "Piotr Wyderski" <wyderskiREMOVE_at_nospam_ii.uni.wroc.pl>
Subject: Re: winavr i sprintf
Date: Sun, 6 Feb 2005 14:25:23 +0100
Maksymilian Dutka wrote:
Wystarczy mi tylko: %s,%i bez dodatkowych opcji formatujących.
No to sobie sam cos takiego napisz, przy tych ograniczeniach
rzezcz jest przeciez banalna. Ja kiedys pisalem wlasnego printfa
(musialem miec 150% pewnosci, ze dziala w ustalony sposob)
z pelnym zestawem opcji formatujacych i stad wiem, ze to
wlasnie one zjadaja tyle pamieci kodu i danych. Bez nich bedzie
to zaledwie jedna albo dwie proste petle.
Pozdrawiam
Piotr Wyderski
From: Adam Dybkowski <adybkows123_at_nospam_amwaw.edu.pl>
Subject: Re: winavr i sprintf
Date: Sun, 06 Feb 2005 14:49:42 +0100
Piotr Wyderski wrote:
Wystarczy mi tylko: %s,%i bez dodatkowych opcji formatujących.
No to sobie sam cos takiego napisz, przy tych ograniczeniach
rzezcz jest przeciez banalna. Ja kiedys pisalem wlasnego printfa
Najlepszym rozwiazaniem jest IMHO sciagniecie zrodel biblioteki avr-libc
i odpowiednie przyciecie pod wlasne potrzeby kodu zrodlowego funkcji
sprintf.
--
Adam Dybkowski
http://www.amwaw.edu.pl/~adybkows/
Uwaga: przed wysłaniem do mnie maila usuń "123" z adresu.
From: "Piotr Wyderski" <wyderskiREMOVE_at_nospam_ii.uni.wroc.pl>
Subject: Re: winavr i sprintf
Date: Sun, 6 Feb 2005 15:12:57 +0100
Adam Dybkowski wrote:
Najlepszym rozwiazaniem jest IMHO sciagniecie zrodel biblioteki avr-libc
i odpowiednie przyciecie pod wlasne potrzeby kodu zrodlowego funkcji
sprintf.
Ale w tym przypadku po cieciu zrodel pozostanie wlasciwie tylko nazwa
funkcji. :->
Pozdrawiam
Piotr Wyderski
From: Adam Dybkowski <adybkows123_at_nospam_amwaw.edu.pl>
Subject: Re: winavr i sprintf
Date: Mon, 07 Feb 2005 20:44:10 +0100
Piotr Wyderski wrote:
Najlepszym rozwiazaniem jest IMHO sciagniecie zrodel biblioteki avr-libc
i odpowiednie przyciecie pod wlasne potrzeby kodu zrodlowego funkcji
sprintf.
Ale w tym przypadku po cieciu zrodel pozostanie wlasciwie tylko nazwa
funkcji. :->
Ją też da się zmienić. :)
--
Adam Dybkowski
http://www.amwaw.edu.pl/~adybkows/
Uwaga: przed wysłaniem do mnie maila usuń "123" z adresu.
From: J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
Subject: Re: winavr i sprintf
Date: Sun, 06 Feb 2005 15:50:28 +0100
On Sat, 05 Feb 2005 20:04:43 +0100, Maksymilian Dutka wrote:
Na ile podobna ?
Wystarczy mi tylko: %s,%i bez dodatkowych opcji formatujących.
puts, itoa, puts.
Ops, sprintf mial byc - strcopy, itoa, ewentualnie strcat.
J.
From: Wojtek Kaniewski <wojtekka_at_nospam_SPAM.SPAM.SPAM>
Subject: Re: winavr i sprintf
Date: Mon, 07 Feb 2005 21:32:57 +0100
Maksymilian Dutka wrote:
Wystarczy mi tylko: %s,%i bez dodatkowych opcji formatujących.
głowy nie daję, bo nie mam pod ręką sprzętu, żeby przesteować.
#include <stdarg.h>
#include <stdlib.h>
void sprintf(char *buf, const char *fmt, ...)
{
va_list ap;
char f, tmp[7], *s;
va_start(ap, fmt);
while ((f = *fmt++)) {
if (f != '%') {
*buf++ = f;
continue;
}
f = *fmt++;
if (f == 's')
s = va_arg(ap, const char*);
else if (f == 'i')
s = itoa(va_arg(ap, int), tmp, 10);
else
continue;
while (*s)
*buf++ = *s++;
}
va_end(ap);
*buf = 0;
}
// w.
From: Maksymilian Dutka <maxdutka_at_nospam_usunpoczta.onet.pl>
Subject: Re: winavr i sprintf
Date: Mon, 07 Feb 2005 22:01:36 +0100
Wojtek Kaniewski napisał(a):
Maksymilian Dutka wrote:
Wystarczy mi tylko: %s,%i bez dodatkowych opcji formatujących.
głowy nie daję, bo nie mam pod ręką sprzętu, żeby przesteować.
#include <stdarg.h>
#include <stdlib.h>
void sprintf(char *buf, const char *fmt, ...)
{
va_list ap;
char f, tmp[7], *s;
va_start(ap, fmt);
while ((f = *fmt++)) {
if (f != '%') {
*buf++ = f;
continue;
}
f = *fmt++;
if (f == 's')
s = va_arg(ap, const char*);
Zamiast "conts char*" kompilator bardziej preferuje "char*"
else if (f == 'i')
s = itoa(va_arg(ap, int), tmp, 10);
else
continue;
while (*s)
*buf++ = *s++;
}
va_end(ap);
*buf = 0;
}
// w.
Niestety funkcja się wywala przy dłuższej liście parametrów (powyżej 2,
np. "%i %i %s"). Chyba jednak wykorzystam fragment printf-a i
"orginalnej" biblioteki, ew. poprawie tą albo coś samemu napisze. Swoją
drogą dlaczego człowiek ma takie skłonności do kombinowania: już dawno
bym go sam napisał jak bym nie kombinował ;)
From: Wojtek Kaniewski <wojtekka_at_nospam_SPAM.SPAM.SPAM>
Subject: Re: winavr i sprintf
Date: Mon, 07 Feb 2005 22:30:07 +0100
Maksymilian Dutka wrote:
s = va_arg(ap, const char*);
Zamiast "conts char*" kompilator bardziej preferuje "char*"
racja, zmienna `s' powinna być zadeklarowana jako `const char *s;'.
zapomniałem poprawić źródła w poście po zmianie źródeł na dysku.
Niestety funkcja się wywala przy dłuższej liście parametrów (powyżej 2,
np. "%i %i %s").
na PC, skompilowane gcc 3.3.5 działa poprawnie, a valgrind żadnych
błędów dotyczących pamięci nie stwierdził. na pewno dobrze wywołujesz?
w.
From: Maksymilian Dutka <maxdutka_at_nospam_usunpoczta.onet.pl>
Subject: Re: winavr i sprintf
Date: Mon, 07 Feb 2005 23:11:48 +0100
Wojtek Kaniewski napisał(a):
Maksymilian Dutka wrote:
s = va_arg(ap, const char*);
Zamiast "conts char*" kompilator bardziej preferuje "char*"
racja, zmienna `s' powinna być zadeklarowana jako `const char *s;'.
zapomniałem poprawić źródła w poście po zmianie źródeł na dysku.
Niestety funkcja się wywala przy dłuższej liście parametrów (powyżej
2, np. "%i %i %s").
na PC, skompilowane gcc 3.3.5 działa poprawnie, a valgrind żadnych
błędów dotyczących pamięci nie stwierdził. na pewno dobrze wywołujesz?
w.
Już jest ok, bardzo dziękuje. To że nie działało z większą ilością
argumentów to chyba moja wina, dobrze nie pamiętam ale chyba dawałem za
mały bufor, troszkę niewyspany jestem... :(
From: Wojtek Kaniewski <wojtekka_at_nospam_SPAM.SPAM.SPAM>
Subject: Re: winavr i sprintf
Date: Sat, 05 Feb 2005 20:47:43 +0100
Maksymilian Dutka wrote:
Jest może jakaś funkcja funkcjonalnie podobna do sprintf ale nie
zjadająca tyle pamięci?
weź źródła vsnprintf() z avr-libc i wytnij to, co nie jest Ci potrzebne.
nikt przecież nie będzie robił setek wariantów tej funkcji, bo jednemu
jest potrzebne tylko %d, innemu są potrzebne %s i %S, a ktośtam jeszcze
chciałby %lu. oczywiście jedni chcą z formatowaniem, inni nie.
w.
From: J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
Subject: Re: winavr i sprintf
Date: Sat, 05 Feb 2005 22:42:43 +0100
On Sat, 05 Feb 2005 18:46:37 +0100, Maksymilian Dutka wrote:
Jest może jakaś funkcja funkcjonalnie podobna do sprintf ale nie
zjadająca tyle pamięci?
sprintf jest taki duzy z powodu swojej funkcjonalnosci wlasnie.
Krocej sie nie da :-)
A co chcesz osiagnac, bo moze wystarczy itoa, ltoa, a nawet i sprintf
wystepuje w wersji okrojonej, np ze zmiennego przecinka.
J.
From: Maksymilian Dutka <maxdutka_at_nospam_usunpoczta.onet.pl>
Subject: Re: winavr i sprintf
Date: Mon, 07 Feb 2005 16:50:07 +0100
J.F. napisał(a):
On Sat, 05 Feb 2005 18:46:37 +0100, Maksymilian Dutka wrote:
Jest może jakaś funkcja funkcjonalnie podobna do sprintf ale nie
zjadająca tyle pamięci?
sprintf jest taki duzy z powodu swojej funkcjonalnosci wlasnie.
Krocej sie nie da :-)
A co chcesz osiagnac, bo moze wystarczy itoa, ltoa, a nawet i sprintf
wystepuje w wersji okrojonej, np ze zmiennego przecinka.
J.
Teraz używam itoa i reszty, ale chciałem sobie jakość to uprościć i
myślałem że może jest jakiś gotowiec ;) Pozostaje mi chyba tylko
napisanie swojego sprintf-a, znając życie modyfikowanie istniejącego
zajmie mi więcej czasu.
From: Adam Dybkowski <adybkows123_at_nospam_amwaw.edu.pl>
Subject: Re: winavr i sprintf
Date: Mon, 07 Feb 2005 20:45:54 +0100
Maksymilian Dutka wrote:
Teraz używam itoa i reszty, ale chciałem sobie jakość to uprościć i
myślałem że może jest jakiś gotowiec ;) Pozostaje mi chyba tylko
napisanie swojego sprintf-a, znając życie modyfikowanie istniejącego
zajmie mi więcej czasu.
Niekoniecznie. Gdy zobaczysz kod źródłowy sprintf'a, prawie oczywiste
stanie się, co można bezpiecznie z niego wyciąć. Większość opcjonalnych
bloków (np. formatowanie zmiennoprzecinkowe) i tak już jest oznaczonych
odpowiednimi #define'ami więc łatwo się tego pozbyć.
Ściągnij źródła avr-libc, pooglądaj i daj znać, co z tego wyszło.
--
Adam Dybkowski
http://www.amwaw.edu.pl/~adybkows/
Uwaga: przed wysłaniem do mnie maila usuń "123" z adresu.
From: Maksymilian Dutka <maxdutka_at_nospam_usunpoczta.onet.pl>
Subject: Re: winavr i sprintf
Date: Mon, 07 Feb 2005 21:19:16 +0100
Adam Dybkowski napisał(a):
Maksymilian Dutka wrote:
Teraz używam itoa i reszty, ale chciałem sobie jakość to uprościć i
myślałem że może jest jakiś gotowiec ;) Pozostaje mi chyba tylko
napisanie swojego sprintf-a, znając życie modyfikowanie istniejącego
zajmie mi więcej czasu.
Niekoniecznie. Gdy zobaczysz kod źródłowy sprintf'a, prawie oczywiste
stanie się, co można bezpiecznie z niego wyciąć. Większość opcjonalnych
bloków (np. formatowanie zmiennoprzecinkowe) i tak już jest oznaczonych
odpowiednimi #define'ami więc łatwo się tego pozbyć.
Ściągnij źródła avr-libc, pooglądaj i daj znać, co z tego wyszło.
Dziękuje, jednak warto było przejrzeć źródła:
/*
* This file can be compiled into more than one flavour. The default
* is to offer the usual modifiers and integer formatting support
* (level 2). Level 1 maintains a minimal version that just offers
* integer formatting, but no modifier support whatsoever. Level 3 is
* intented for floating point support.
*/
Ściągnę sobie narzędzia potrzebne do kompilacji i zobaczę co z tego
wyjdzie :)
From: Jurek Szczesiul <jerzy.szczesiul_at_nospam_wycin.ep.com.pl>
Subject: Re: winavr i sprintf
Date: Mon, 7 Feb 2005 23:00:31 +0100
Mon, 07 Feb 2005 21:19:16 +0100, na pl.misc.elektronika, Maksymilian Dutka
napisał(a):
/*
* This file can be compiled into more than one flavour. The default
* is to offer the usual modifiers and integer formatting support
* (level 2). Level 1 maintains a minimal version that just offers
* integer formatting, but no modifier support whatsoever. Level 3 is
* intented for floating point support.
*/
Ściągnę sobie narzędzia potrzebne do kompilacji i zobaczę co z tego
wyjdzie :)
To juz jest w avr-libc gotowe - biblioteki są w trzech wersjach. Domyślnie
używana jest "średnia"; w opcjach linkera można wybrać pełną ( z floatem )
albo minimalną.
--
Pozdrowienia
Jurek Szczesiul