Jest może jakaś funkcja funkcjonalnie podobna do sprintf ale nie zjadająca tyle pamięci?
- posted
19 years ago
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.
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... :(
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.