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

Martin Záruba swz na volny.cz
Pondělí Duben 15 17:10:39 CEST 2024


No asi jo. Ale jak to napsat líp?

Martin Záruba

Dne 15.4.2024 v 17:01 Petr Labaj napsal(a):
> 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
>
>
> _______________________________________________
> 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/92f73cd1/attachment.htm>


Další informace o konferenci Hw-list