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

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


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ší informace o konferenci Hw-list