winavr i sprintf

Jest może jakaś funkcja funkcjonalnie podobna do sprintf ale nie zjadająca tyle pamięci?

Reply to
Maksymilian Dutka
Loading thread data ...

Sat, 05 Feb 2005 18:46:37 +0100, na pl.misc.elektronika, Maksymilian Dutka napisał(a):

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.

Reply to
Jacek Czerwinski

Jacek Czerwinski napisał(a):

Wystarczy mi tylko: %s,%i bez dodatkowych opcji formatujących.

Reply to
Maksymilian Dutka

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.

Reply to
Wojtek Kaniewski

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.

Reply to
J.F.

Najlepszym rozwiazaniem jest IMHO sciagniecie zrodel biblioteki avr-libc i odpowiednie przyciecie pod wlasne potrzeby kodu zrodlowego funkcji sprintf.

Reply to
Adam Dybkowski

Ale w tym przypadku po cieciu zrodel pozostanie wlasciwie tylko nazwa funkcji. :->

Pozdrawiam Piotr Wyderski

Reply to
Piotr Wyderski

puts, itoa, puts. Ops, sprintf mial byc - strcopy, itoa, ewentualnie strcat.

J.

Reply to
J.F.

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.

Reply to
Maksymilian Dutka

Ją też da się zmienić. :)

Reply to
Adam Dybkowski

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.

Reply to
Adam Dybkowski

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 :)

Reply to
Maksymilian Dutka

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.

Reply to
Wojtek Kaniewski

Zamiast "conts char*" kompilator bardziej preferuje "char*"

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ł ;)

Reply to
Maksymilian Dutka

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.

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.

Reply to
Wojtek Kaniewski

Mon, 07 Feb 2005 21:19:16 +0100, na pl.misc.elektronika, Maksymilian Dutka napisał(a):

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ą.

Reply to
Jurek Szczesiul

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... :(

Reply to
Maksymilian Dutka

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.