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

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Pondělí Duben 15 17:20:20 CEST 2024


Uz to tu bylo, udelal bych to jednoduse pres printf, ktere v zakladni 
verzi zas tak moc pameti nesezere (bez float) jako /1000 a %1000 s %03u
Pokud jsou cisla kladna, zaporna je potreba resit extra v absolutni 
hodnote (nebo jinak ale zas tak to uz neresim a float rovnou povolim, 
kdyz je malo pameti, koupim procesor s vetsi ;-) )
Dne 15.04.2024 v 17:14 Martin Záruba napsal(a):
>
> S tím double máte pravdu. Ale nějak nechápu, jak pomocí utoa() 
> JEDNODUŠE dosáhnout, aby se mi vypsaly ty nuly třeba př. 81.002
>
> Martin Záruba
> Dne 15.4.2024 v 17:04 Jan Waclawek napsal(a):
>> No ved dobre, double to je priamociare peklo este aj v ARM Cortex-Mx kde x
>> < 7.
>>
>> Takze to rozdelte pomocou /1000 a %1000 ako v tom druhom pripade, a pouzite
>> utoa(). Treba si dat pozor na zlomkovu cast mensiu ako 100, finta je
>> pripocitat 1000 a potom odstranit tu jednicku zo zaciatku.
>>
>> wek
>>
>>
>>
>> ----- Original Message ---------------
>>
>> Subject: Re: sprintf - co dělám blbě?
>>     From: Martin Záruba<swz na volny.cz>
>>     Date: Mon, 15 Apr 2024 16:40:23 +0200
>>       To:hw-list na list.hw.cz
>>
>>> 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);
>>>>>>>
>> _______________________________________________
>> 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/e172f7b6/attachment.htm>


Další informace o konferenci Hw-list