Re: sprintf - co dělám blbě?

Jan Waclawek konfera na efton.sk
Pondělí Duben 15 14:54:46 CEST 2024


Na ten 'l' som odkazal do C99 t.j. specifikacia jazyka C. Ja viem ze
Arduino je C++ ale v tomto je to jedno. Ta specifikacia je necitatelna,
urcite existuju aj lepsie zoznamy tych veci co sa daju napisat za %; ale
kedze (ako som pisal) *printf nepouzivam, tak neviem dobry odkaz.

Pan kolega Blaha to pisal Arduino-specificky tu:
https://list.hw.cz/pipermail/hw-list/2024-April/571212.html

Vseobecne je to pre avr-libc (co je v pozadi toho *printf()) zdokumentovane
tu
https://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html#gaa3b98c0d17b35642c0f3e4649092b9f1
pod "compiler options", ale ani to nie je pre smrtelnika  citatenle.

Mimochodom, to "mam nejake normalne cislo a po nejakej operacii je z neho
nejake divne" vedie podla mojich skusenosti asi tak v 3/4 pripadov na
chybu nasledkom orezania v binarnom tvare, z roznych dovodov. Ale tiez je
mozne, ze som jednoducho babrak a normalne to ma byt ovela mensie
percento... :-)

> co je špatného na printf v jednočipu?

Aj minimalne implementacie ktore su vlastne nestandardne (napr. tym ze
netlacia float) su privelke; castokrat nerobia to, co potrebujete, takze
aj tak potom retazec dodatocne vselijako priohybate; ak by ste pouzivali
ARM a RTOS tak mozete narazit na tuto srandu
https://nadler.com/embedded/newlibAndFreeRTOS.html (t.j. ze *printf()
pouziva malloc() ktory nemusi byt reentrantny; co vsak je prekvapujuco v
poriadku, lebo ziadna kniznicna funkcia v C nemusi byt reentrantna, to je
zrejme pre vacsinu programatorov sokujuca novinka); asi by sa naslo aj
ine. Pan kolega Labaj uz tiez napisal nejake argumenty.

(Hm, myslel som si, ze som to printf() dostatocne intenzivne oplul v knihe,
ale neviem to tam najst... )

wek





----- Original Message ---------------

Subject: Re: sprintf - co dělám blbě?
   From: Martin Blaha <conf.hw na elektronek.cz>
   Date: Mon, 15 Apr 2024 14:09:10 +0200
     To: hw-list na list.hw.cz

>pro ten tisk floatů jsem Vám napsal k Vašemu původnímu dotazu 
>"formátovaný výstup" .... zřejmě jste to nečetl
>
>M
>
>Dne 15.04.2024 v 14:06 Martin Záruba napsal(a):
>>
>> Dík. To mě fakt nenapadlo. Nikde jsem nenašel, parametr l. No patří mi to.
>>
>> Lze ho nějak podobně donutit i k formátování float? Vypisuje otazník.
>>
>> Martin Záruba
>> P.S. co je špatného na printf v jednočipu?
>> Dne 15.4.2024 v 13:58 Jan Waclawek napsal(a):
>>> %lu
>>>
>>> C99, 7.19.6.1#7 (conversion modifier l)
>>>
>>> Conversion specifier, t.j. "zakladny typ", co je tu to "u", je v tych %xxx
>>> vzdy posledne.
>>>
>>> wek
>>>
>>>
>>> PS. <flame on> Na odtazku z nadpisu mam chut odpovedat, ze "pouzivate
>>> *printf v jednocipe"...
>>>
>>>
>>> ----- Original Message ---------------
>>>
>>>> Prostě se to někde orizne na 16bitů. Nemá to být ul?
>>>> Opět upozorňuji na zdravý zvyk používat snprintf...
>>>>
>>>> J.
>>>>
>>>> ---------- Původní e-mail ----------
>>>> Od: Martin Záruba<swz na volny.cz>
>>>> Komu: Martin Zaruba<hw-list na list.hw.cz>
>>>> Datum: 15.04.2024 13:35:10
>>>> Předmět: sprintf - co dělám blbě?
>>>>
>>>> "
>>>>
>>>> Tento triviální kousek programu
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>    char sStringBuffer[50];
>>>>
>>>>    sprintf(sStringBuffer,"%6u",(uint32_t)123456);
>>>>
>>>>    Serial.print(sStringBuffer);
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> vrací hodnotu 57920. Ale proč?
>>>>




Další informace o konferenci Hw-list