winavr i sprintf

Feb 05, 2005 17 Replies

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


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.

Jacek Czerwinski napisał(a):

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

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.

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.

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

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

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

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.

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

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

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.

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

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.

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

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

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required