Re: sprintf - co dělám blbě?
Petr Labaj
labaj na volny.cz
Pondělí Duben 15 17:22:45 CEST 2024
Já na takové výpisy mám udělanou jednoduchou funkci, která jako parametr
dostane integer vstup, počet znaků na které to má převést, a pozici, na
které má být desetinná tečka.
Pokud byste to chtěl mít rychle rychle, tak třeba zednicky zkonvertovat
ten integer do stringu číslic, pak ho projít cyklem a do druhého stringu
nakopírovat číslice před desetinnou tečkou, pak přidat znak tečky, a
dokopírovat zbylé číslice.
Pak píšu - je to zednicky, ale máte to hned, bude to celé integer a bude
to asi celkem malé.
PL
*******************
Dne 15.4.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/56af9823/attachment-0001.htm>
Další informace o konferenci Hw-list