winavr i sprintf





Poprzedni Następny
Wiadomość
Spis treści
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?

Poprzedni Następny
Wiadomość
Spis treś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.

Poprzedni Następny
Wiadomość
Spis treści
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.

Poprzedni Następny
Wiadomość
Spis treści
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


Poprzedni Następny
Wiadomość
Spis treści
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.

Poprzedni Następny
Wiadomość
Spis treści
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


Poprzedni Następny
Wiadomość
Spis treści
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.

Poprzedni Następny
Wiadomość
Spis treści
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.



Poprzedni Następny
Wiadomość
Spis treści
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.

Poprzedni Następny
Wiadomość
Spis treści
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ł ;)

Poprzedni Następny
Wiadomość
Spis treści
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.

Poprzedni Następny
Wiadomość
Spis treści
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... :(

Poprzedni Następny
Wiadomość
Spis treści
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.

Poprzedni Następny
Wiadomość
Spis treści
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.





Poprzedni Następny
Wiadomość
Spis treści
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.




Poprzedni Następny
Wiadomość
Spis treści
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.

Poprzedni Następny
Wiadomość
Spis treści
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 :)

Poprzedni Następny
Wiadomość
Spis treści
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