Re: sprintf - co dělám blbě?
Petr Labaj
labaj na volny.cz
Pondělí Duben 15 17:01:03 CEST 2024
I té první máte float-aritmetiku, kdežto ta druhá varianta je jen na
integerech.
Nebude to tím?
PL
******************
Dne 15.4.2024 v 16:40 Martin Záruba napsal(a):
>
> 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
>
> _______________________________________________
> 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/4786120d/attachment.htm>
Další informace o konferenci Hw-list