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

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


Tak jsem našel nějaké historické prostředí Arduino a zkusil to přeložit 
pro AVR.
Tento vysoce sofistikovaný program zabral 162 byte Flash.
Z čehož je předpokládám většina ta knihovní funkce utoa.

PL

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

Dne 15.4.2024 v 18:08 Petr Labaj napsal(a):
> 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);
>>>>>>>>>
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20240415/a620e8a5/attachment-0001.htm>


Další informace o konferenci Hw-list