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

Petr Labaj labaj na volny.cz
Pondělí Duben 15 18:08:32 CEST 2024


Schválně, jak dlouhé by vyšlo tohle?
(nemám Arduino, tak nevyzkouším)

char buf [6];

utoa (milivolt, buf, 10);
Serial.write (buf, 2);
Serial.write ('.');
Serial.write (buf+2, 3);

PL

********************

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


Další informace o konferenci Hw-list