<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p><font face="Arial">Tak jsem dal na Vaši radu a zkusil udělat
        funkci, která uint32_t převede na pevný počet míst s desetinnou
        tečkou. Takto to dopadlo:</font></p>
    <div
style="color: #4e5b61;background-color: #ffffff;font-family: Consolas, 'Courier New', monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;"><div><span
    style="color: #95a5a6;">// val - vypisované číslo</span></div><div><span
    style="color: #95a5a6;">// length - počet znaků (3 až 10)</span></div><div><span
    style="color: #95a5a6;">// decimal - počet desetinných míst (1 až 3ength - 2)</span></div><div><span
    style="color: #4e5b61;">String </span><span style="color: #d35400;">Fultoa</span><span
    style="color: #434f54;">(</span><span style="color: #00979d;">uint32_t</span><span
    style="color: #4e5b61;"> </span><span style="color: #434f54;">val</span><span
    style="color: #4e5b61;">,</span><span style="color: #00979d;">uint8_t</span><span
    style="color: #4e5b61;"> </span><span style="color: #434f54;">length</span><span
    style="color: #4e5b61;">,</span><span style="color: #00979d;">uint8_t</span><span
    style="color: #4e5b61;"> </span><span style="color: #434f54;">decimal)</span><span
    style="color: #4e5b61;"> </span><span style="color: #434f54;">{</span></div><div><span
    style="color: #4e5b61;">  </span><span style="color: #00979d;">char</span><span
    style="color: #4e5b61;"> </span><span style="color: #d35400;">buf</span><span
    style="color: #4e5b61;">[</span><span style="color: #005c5f;">11</span><span
    style="color: #4e5b61;">];</span></div><div><span
    style="color: #4e5b61;">  </span><span style="color: #00979d;">uint32_t</span><span
    style="color: #4e5b61;"> k=</span><span style="color: #005c5f;">100</span><span
    style="color: #4e5b61;">;</span></div><div><span
    style="color: #4e5b61;">  </span><span style="color: #728e00;">for</span><span
    style="color: #4e5b61;"> </span><span style="color: #434f54;">(</span><span
    style="color: #00979d;">uint8_t</span><span style="color: #4e5b61;"> i = </span><span
    style="color: #005c5f;">3</span><span style="color: #4e5b61;">;i < length; i++</span><span
    style="color: #434f54;">)</span><span style="color: #4e5b61;"> k*=</span><span
    style="color: #005c5f;">10</span><span style="color: #4e5b61;">;</span></div><div><span
    style="color: #4e5b61;">  </span><span style="color: #d35400;">ultoa</span><span
    style="color: #434f54;">(</span><span style="color: #4e5b61;">val+k, buf, </span><span
    style="color: #005c5f;">10</span><span style="color: #434f54;">)</span><span
    style="color: #4e5b61;">;</span></div><div><span
    style="color: #4e5b61;">  </span><span style="color: #728e00;">for</span><span
    style="color: #4e5b61;"> </span><span style="color: #434f54;">(</span><span
    style="color: #00979d;">uint8_t</span><span style="color: #4e5b61;"> i = </span><span
    style="color: #005c5f;">0</span><span style="color: #4e5b61;">; i < length - decimal - </span><span
    style="color: #005c5f;">2</span><span style="color: #4e5b61;">; i++</span><span
    style="color: #434f54;">)</span><span style="color: #4e5b61;"> </span><span
    style="color: #434f54;">{</span></div><div><span
    style="color: #4e5b61;">    </span><span style="color: #728e00;">if</span><span
    style="color: #4e5b61;"> </span><span style="color: #434f54;">(</span><span
    style="color: #d35400;">buf</span><span style="color: #4e5b61;">[i + </span><span
    style="color: #005c5f;">1</span><span style="color: #4e5b61;">] == </span><span
    style="color: #4e5b61;">'0'</span><span style="color: #434f54;">)</span></div><div><span
    style="color: #4e5b61;">      </span><span style="color: #d35400;">buf</span><span
    style="color: #4e5b61;">[i] = </span><span style="color: #4e5b61;">' '</span><span
    style="color: #4e5b61;">;</span></div><div><span
    style="color: #4e5b61;">    </span><span style="color: #728e00;">else</span></div><div><span
    style="color: #4e5b61;">      </span><span style="color: #d35400;">buf</span><span
    style="color: #4e5b61;">[i] = </span><span style="color: #d35400;">buf</span><span
    style="color: #4e5b61;">[i + </span><span style="color: #005c5f;">1</span><span
    style="color: #4e5b61;">];</span></div><div><span
    style="color: #4e5b61;">  </span><span style="color: #434f54;">}</span></div><div><span
    style="color: #4e5b61;">  </span><span style="color: #d35400;">buf</span><span
    style="color: #4e5b61;">[length - decimal - </span><span
    style="color: #005c5f;">2</span><span style="color: #4e5b61;">] = </span><span
    style="color: #d35400;">buf</span><span style="color: #4e5b61;">[length - decimal - </span><span
    style="color: #005c5f;">1</span><span style="color: #4e5b61;">];</span></div><div><span
    style="color: #4e5b61;">  </span><span style="color: #d35400;">buf</span><span
    style="color: #4e5b61;">[length - decimal - </span><span
    style="color: #005c5f;">1</span><span style="color: #4e5b61;">] = </span><span
    style="color: #4e5b61;">'.'</span><span style="color: #4e5b61;">;</span></div><div><span
    style="color: #4e5b61;">  </span><span style="color: #728e00;">return</span><span
    style="color: #4e5b61;"> buf;</span></div><div><span
    style="color: #434f54;">}</span></div>
<div
style="color: #4e5b61;background-color: #ffffff;font-family: Consolas, 'Courier New', monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;"><div><span
    style="color: #d35400;">Serial</span><span style="color: #4e5b61;">.</span><span
    style="color: #d35400;">println</span><span style="color: #434f54;">(</span><span
    style="color: #d35400;">Fultoa</span><span style="color: #434f54;">(</span><span
    style="color: #005c5f;">1</span><span style="color: #4e5b61;">,</span><span
    style="color: #005c5f;">10</span><span style="color: #4e5b61;">,</span><span
    style="color: #005c5f;">3</span><span style="color: #434f54;">))</span><span
    style="color: #4e5b61;">;</span></div><div><span
    style="color: #d35400;">Serial</span><span style="color: #4e5b61;">.</span><span
    style="color: #d35400;">println</span><span style="color: #434f54;">(</span><span
    style="color: #d35400;">Fultoa</span><span style="color: #434f54;">(</span><span
    style="color: #005c5f;">987654321</span><span
    style="color: #4e5b61;">,</span><span style="color: #005c5f;">10</span><span
    style="color: #4e5b61;">,</span><span style="color: #005c5f;">2</span><span
    style="color: #434f54;">))</span><span style="color: #4e5b61;">;</span></div><div><span
    style="color: #d35400;">Serial</span><span style="color: #4e5b61;">.</span><span
    style="color: #d35400;">println</span><span style="color: #434f54;">(</span><span
    style="color: #d35400;">Fultoa</span><span style="color: #434f54;">(</span><span
    style="color: #005c5f;">21</span><span style="color: #4e5b61;">,</span><span
    style="color: #005c5f;">3</span><span style="color: #4e5b61;">,</span><span
    style="color: #005c5f;">1</span><span style="color: #434f54;">))</span><span
    style="color: #4e5b61;">;</span></div>
</div><div
style="color: #4e5b61;background-color: #ffffff;font-family: Consolas, 'Courier New', monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;">a toto to dělá
</div><div
style="color: #4e5b61;background-color: #ffffff;font-family: Consolas, 'Courier New', monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;">
</div><div
style="color: #4e5b61;background-color: #ffffff;font-family: Consolas, 'Courier New', monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;">
</div><div
style="color: #4e5b61;background-color: #ffffff;font-family: Consolas, 'Courier New', monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;">     0.001
9876543.21
2.1
</div></div>
    <p></p>
    <pre class="moz-signature" cols="72">Martin Záruba</pre>
    <div class="moz-cite-prefix">Dne 15.4.2024 v 17:04 Jan Waclawek
      napsal(a):<br>
    </div>
    <blockquote type="cite"
      cite="mid:PC195202404151704220709c685c71b@wekPC">
      <pre class="moz-quote-pre" wrap="">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 <a class="moz-txt-link-rfc2396E" href="mailto:swz@volny.cz"><swz@volny.cz></a>
   Date: Mon, 15 Apr 2024 16:40:23 +0200
     To: <a class="moz-txt-link-abbreviated" href="mailto:hw-list@list.hw.cz">hw-list@list.hw.cz</a>

</pre>
      <blockquote type="cite">
        <pre class="moz-quote-pre" wrap="">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):
</pre>
        <blockquote type="cite">
          <pre class="moz-quote-pre" wrap="">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):
</pre>
          <blockquote type="cite">
            <pre class="moz-quote-pre" wrap="">
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):
</pre>
            <blockquote type="cite">
              <pre class="moz-quote-pre" wrap="">%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 ---------------

</pre>
              <blockquote type="cite">
                <pre class="moz-quote-pre" wrap="">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<a class="moz-txt-link-rfc2396E" href="mailto:swz@volny.cz"><swz@volny.cz></a>
Komu: Martin Zaruba<a class="moz-txt-link-rfc2396E" href="mailto:hw-list@list.hw.cz"><hw-list@list.hw.cz></a>
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);

</pre>
              </blockquote>
            </blockquote>
          </blockquote>
        </blockquote>
      </blockquote>
      <pre class="moz-quote-pre" wrap="">_______________________________________________
HW-list mailing list  -  sponsored by <a class="moz-txt-link-abbreviated" href="http://www.HW.cz">www.HW.cz</a>
<a class="moz-txt-link-abbreviated" href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a>
<a class="moz-txt-link-freetext" href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a>
</pre>
    </blockquote>
  </body>
</html>