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

Martin Záruba swz na volny.cz
Pondělí Duben 15 16:40:23 CEST 2024


Je to zcela logické, ale výsledek překladu tomu neodpovídá, ale zjevně 
je chyba u mě. Potřeboval jsem vypsat uint16_t proměnnou 
JKComputedData.BatteryVoltageMillivolt, která obsahuje napětí baterie v 
milivoltech. Ale chtěl jsem, aby výpis byl ve voltech, tedy aby to napsalo:

Napětí 80.245V

zkusil jsem dvě varianty:

Serial.print(PSTR("Napětí"));Serial.print(dtostrf(JKComputedData.BatteryVoltageMillivolt/1000.0, 
7, 3, sStringBuffer));Serial.print("V, ");
sprintf_P(sStringBuffer,PSTR("Napětí%3d.%03dV, 
"),JKComputedData.BatteryVoltageMillivolt/1000,JKComputedData.BatteryVoltageMillivolt%1000);Serial.print(sStringBuffer);

ta první, bez sprintf je o 1372 byte delší.

Martin Záruba

Dne 15.4.2024 v 14:29 Petr Labaj napsal(a):
> Dovolím si zareagovat a trochu rozvinout poznámku pana weka o 
> nevhodnosti používání *printf na jednochipech (se kterou souzním).
> Všechny ty *printf jsou obecně dost mocné funkce, které umí formátovat 
> kde co, kde jak.
> Ale protože toho umí hodně, tak jsou velké.
> Na nějakém PC s gigabyty paměti to moc nevadí, ale pro použití na MCU 
> to (podle mě, a asi i podle pana weka) moc vhodné není.
> Proto když už tam jsou jsou, tak jsou často všelijak osekané a některé 
> věci neumí (třeba ty float a double, které se případně musí nějak 
> extra povolit).
>
> Takže obecné doporučení: zvažte, jestli fakt potřebujete univerzální 
> *printf.
> Jestli si raději nenapíšete svou vlastní konverzi pro textový výstup, 
> která bude umět jen to, co potřebujete.
> Ale zase na druhé straně bude dělat přesně to, co potřebujete.
>
> PL
>
> ******************
>
> Dne 15.4.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č?
>>>>
>
>
> _______________________________________________
> HW-list mailing list  -  sponsored bywww.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20240415/00c150e2/attachment.htm>


Další informace o konferenci Hw-list