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

Jan Waclawek konfera na efton.sk
Pondělí Duben 15 17:25:05 CEST 2024


> JEDNODUŠE 

To je nova poziadavka, o tej sme sa doteraz vobec nebavili.

Ale ano, ak je priorita JEDNODUŠE, tak pokojne arduino, double, printf(),
trebars aj micropython alebo PICAXE. 

V mcu neexistuje NAJLEPSIE, vzdy je to o poziadavkach a kompromisoch.

wek




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

>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 ---------------
>>>>>>


Další informace o konferenci Hw-list