<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    Tak jsem našel nějaké historické prostředí Arduino a zkusil to
    přeložit pro AVR.<br>
    Tento vysoce sofistikovaný program zabral 162 byte Flash.<br>
    Z čehož je předpokládám většina ta knihovní funkce utoa.<br>
    <br>
    PL<br>
    <br>
    ***************<br>
    <br>
    <div class="moz-cite-prefix">Dne 15.4.2024 v 18:08 Petr Labaj
      napsal(a):<br>
    </div>
    <blockquote type="cite"
      cite="mid:047dc847-0587-8c17-ae99-a1b9aa040192@volny.cz">
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      Schválně, jak dlouhé by vyšlo tohle?<br>
      (nemám Arduino, tak nevyzkouším)<br>
      <br>
      char buf [6];<br>
      <br>
      utoa (milivolt, buf, 10);<br>
      Serial.write (buf, 2);<br>
      Serial.write ('.');<br>
      Serial.write (buf+2, 3);<br>
      <br>
      PL<br>
      <br>
      ********************<br>
      <br>
      <div class="moz-cite-prefix">Dne 15.4.2024 v 17:22 Petr Labaj
        napsal(a):<br>
      </div>
      <blockquote type="cite"
        cite="mid:4b809508-5228-299c-763b-885c010abd72@volny.cz">
        <meta http-equiv="Content-Type" content="text/html;
          charset=UTF-8">
        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.<br>
        <br>
        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.<br>
        Pak píšu - je to zednicky, ale máte to hned, bude to celé
        integer a bude to asi celkem malé.<br>
        <br>
        PL<br>
        <br>
        *******************<br>
        <br>
        <div class="moz-cite-prefix">Dne 15.4.2024 v 17:14 Martin Záruba
          napsal(a):<br>
        </div>
        <blockquote type="cite"
          cite="mid:02da0aa0-a32a-41e7-b579-6213e5f2a98a@volny.cz">
          <meta http-equiv="Content-Type" content="text/html;
            charset=UTF-8">
          <p><font face="Arial">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</font><br>
          </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" moz-do-not-send="true"><swz@volny.cz></a>
   Date: Mon, 15 Apr 2024 16:40:23 +0200
     To: <a class="moz-txt-link-abbreviated moz-txt-link-freetext" href="mailto:hw-list@list.hw.cz" moz-do-not-send="true">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" moz-do-not-send="true"><swz@volny.cz></a>
Komu: Martin Zaruba<a class="moz-txt-link-rfc2396E" href="mailto:hw-list@list.hw.cz" moz-do-not-send="true"><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>
          </blockquote>
        </blockquote>
      </blockquote>
    </blockquote>
    <br>
  </body>
</html>