[elektro] C őrjöngés...
SZIGETI Szabolcs
szigiszabolcs at gmail.com
Wed Nov 27 17:09:38 CET 2013
Igen, Erre valójában nincsen mentség, de ez a C alacsony szintűségéből
ered. Történelmi oka az, hogy a printf egy ugyanolyan mezei függvény, mint
bármelyik másik, csak ugye meg kellett oldani a tetszőleges számú
argumentum használatát. Olyanmeg csak buherálással van a C_ben. Itt
valójában az történik, hogy híváskor bepakolja a verembe az összes
argumentumot, a printf, meg a _formátumstring_ alapján kibányássza onnan.
Ha rossz a stringed, akkor rossz formában fogja kiszedni. Ez olyan, mintha
mindent beraknál egy char tömbbe, aztán utána kiszednéd. ha nem ugyanolyan
formában szeded ki, akkor bukta van.
Kulturáltabb fordítók felismerik, hogy a printf különleges és megnézik,
hogy rendben van-e az argumentumlista.
Pl. C++-ban ez működne, hogy
int i;
double f;
cout<<"Az érték:"<<i<<" átlagosan "<<f<<"\n"
De ennek is megvannak a maga bajai, itt ha mezőszélességet meg tizedesjegy
hosszat akarsz állítani, akkor sokkal gusztustalanabb lesz, mint a printf.
Ezt tudom ajánlani puskának: https://infoc.eet.bme.hu/jegyzet/c_puska.pdf
(második oldal, formatted output fejezet).
Szabolcs
2013. november 27. 16:59 Skandar Graun írta, <sgraun at gmail.com>:
> "Kultúráltabb fordító elemzi a formátum stringet és szól (warning) ha nem
> egyezik meg a formátumstringben szerinti típus a megadottal."
>
> Pontosan... mert minden marhaságra szól...
> mint pölö:
> pakarutins.c:237: warning: pointer targets in passing argument 1 of
> 'UART2_PutChar' differ in signedness
>
> Ezt itt miért nem tudta?
> De mindegy, már kiőrjöngtem magam. :)
>
>
>
> 2013. november 27. 16:55 Lajos Rancz írta, <lajos.rancz at gmail.com>:
>
> > Helló!
> >
> > Mivel nem C++-ban vagy ahol ezt meg lehetne csinálni (mert vannak rá
> nyelvi
> > eszközök), csak C-ben ezért ez a következőképpen működik:
> >
> > 1. va_start-al inicializál és kitalálja a paraméterek számát, i = 0
> > 2. utána a formátum string alapján megcastolja az i-edik a paramétert
> a
> > va_arg makróval a kívánt típusra (tehát a %valami alapján van egy
> > switch)
> > 3. kiír
> > 4. i++, goto 2 ha még van
> >
> > Kultúráltabb fordító elemzi a formátum stringet és szól (warning) ha nem
> > egyezik meg a formátumstringben szerinti típus a megadottal.
> >
> > Üdv
> >
> >
> >
> > 2013. november 27. 16:46 Skandar Graun írta, <sgraun at gmail.com>:
> >
> > > %d
> > >
> > > Nem mondod, hogy nem elég alapvetően meghatározni a változó típusát...
> > még
> > > külön tököljek vele a kiíratásnál...
> > >
> > >
> > > 2013/11/27 Lajos Rancz <lajos.rancz at gmail.com>
> > >
> > > > Hi!
> > > >
> > > > "%d"-vel vagy "%u"-val írod ki?
> > > >
> > > > Üdv
> > > >
> > > >
> > > > 2013/11/27 Skandar Graun <sgraun at gmail.com>
> > > >
> > > > > Mijaf at szért ír ki signedként az sprintf egy unsigned intet???
> > > > > Ááááááááááá
> > > > > -----------------------------------------
> > > > > elektro[-flame|-etc]
> > > > >
> > > > -----------------------------------------
> > > > elektro[-flame|-etc]
> > > >
> > > -----------------------------------------
> > > elektro[-flame|-etc]
> > >
> > -----------------------------------------
> > elektro[-flame|-etc]
> >
> -----------------------------------------
> elektro[-flame|-etc]
>
More information about the Elektro
mailing list