<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p><font face="Arial">Já to tak původně dělal, jenže byl to mnohem
        složitější a vlastně můžete takto udělat jen část než narazíte
        na první formátovací znak. Pak už je to stejně jen odeslání
        čísla. protože nevíte, zda nebude následovat další formátovací
        znak po libovolné počtu "výplní". Tvar text,val, míst se mi
        nelíbil, protože s ním neuděláte třeba 10mV. Takto je text
        kdekoli, dokonce je kdekoli i třeba \n, takže nemá smysl
        println. A varinta txtPred, val, míst, txtPo to sice umí, ale
        jsou 4 parametry a stejně nejde udělat třeba odskočené tisíce.
        Taky se mi líbí, že to sežere i float. Předpokládím, že buffer
        se vytvoří na zásobníku a po opuštění funkce zmizí. Je to tak?</font></p>
    <p><font face="Arial">Ještě to chci doplnit o možnost mít
        formátovací řetězec ve flash. Není mi ale jasné, jaký je rozdíl
        mezi PSTR("V paměti flash") a F("V paměti flash"). Asi se mi víc
        líbí F(" "), je to kratší zápis a dovoluje přetížení funkce. Ale
        možná má nějakou nevýhodu, na kterou jsem nepřišel.<br>
      </font></p>
    <pre class="moz-signature" cols="72">Martin Záruba</pre>
    <div class="moz-cite-prefix">Dne 19.4.2024 v 20:50 Pavel Hudeček
      napsal(a):<br>
    </div>
    <blockquote type="cite"
      cite="mid:b4bb63a0-c0e8-4e00-bb0f-836ae08e652c@seznam.cz">Moc
      pěkný.
      <br>
      Já bych teda akorát nekopíroval celý text do velkého bufferu a
      místo toho text před číslem rovnou odesílal v prvním do/while, pak
      převed a odeslal číslo a nakonec odeslal zbytek vstupního textu.
      <br>
      <br>
      Už jsem taky kdysi použil variantu, kdy se zadávají parametry
      (text, val, mist) a v textu je pak znak pro umístění čísla a des.
      míst se odešle podle hodnoty mist. Častějc mám ale (txtPred, val,
      mist, txtPo).
      <br>
      <br>
      Odesílání mám teda téměř vždy rovnou průběžně po znacích a
      odesílací funkce čeká jen na dokončení předchozího znaku, takže
      konverze na výstupní text probíhá paralelně s odesíláním.
      <br>
      <br>
      PH
      <br>
      <br>
      Dne 19.04.2024 v 19:23 Martin Záruba napsal(a):
      <br>
      <blockquote type="cite">Už jsem se Vás dost natrápil na toto téma
        a měl jsem pocit, že nic moc úsporného a jednoduše použitelného
        není. Jenže jsem paličatý a zkusil jsem přece něco vymyslet.
        Požadavek byl:
        <br>
        <br>
        Výpis na požadovaný počet míst s možností textu před i za
        číslem.
        <br>
        <br>
        Potlačení nevýznamných nul.
        <br>
        <br>
        Co nejúspornější kód jak funkce, tak volání, vhodný pro malinky
        procesor.
        <br>
        <br>
        Přímý tisk bez nutnosti psaní Serial.print();
        <br>
        <br>
        Vyrobil jsem toto, posuďte a navrhněte prosím co by ještě šlo
        líp.
        <br>
        <br>
        <br>
        void pr(int32_t h, const char* f) {
        <br>
          char buf[100];
        <br>
          uint8_t i = 0xFF;
        <br>
          int32_t x = abs(h);
        <br>
          do {
        <br>
            i++;
        <br>
            buf[i] = f[i];
        <br>
          } while (f[i] != 0);
        <br>
        <br>
          do {
        <br>
            i--;
        <br>
            if (buf[i] == '#') {
        <br>
              if (x != 0) {
        <br>
                buf[i] = x % 10 + (uint8_t)'0';
        <br>
                if (h < 0 && x < 10) {
        <br>
                  i--;
        <br>
                  buf[i] = '-';
        <br>
                }
        <br>
              } else {
        <br>
                buf[i] = ' ';
        <br>
              }
        <br>
              x /= 10;
        <br>
            }
        <br>
          } while (i != 0);
        <br>
          Serial.print(buf);
        <br>
        }
        <br>
        <br>
        <br>
        Funkce má jediný formátovací znak #
        <br>
        <br>
        Příklady:
        <br>
        <br>
        int32_t napetimV = 5432;
        <br>
        pr(napetimV, "Pokus1=###.###V\n");
        <br>
        pr(-21,      "Pokus2=### zaporne cislo\n");
        <br>
        pr(9876543,  "Pokus3=# ### ### cislo s mezerami po 1000\n");
        <br>
        float a = 54.3;
        <br>
        pr(a*10,     "Pokus4=####.# vypis float na 1 desetinne
        misto\n");
        <br>
        <br>
        Výsledek vypadá takto:
        <br>
        <br>
        Pokus1=  5.432V
        <br>
        Pokus2=-21 zaporne cislo
        <br>
        Pokus3=9 876 543 cislo s mezerami po 1000
        <br>
        Pokus4=   54.3 vypis float na 1 desetinne misto
        <br>
      </blockquote>
      <br>
      _______________________________________________
      <br>
      HW-list mailing list  -  sponsored by <a class="moz-txt-link-abbreviated" href="http://www.HW.cz">www.HW.cz</a>
      <br>
      <a class="moz-txt-link-abbreviated" href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a>
      <br>
      <a class="moz-txt-link-freetext" href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a>
      <br>
    </blockquote>
  </body>
</html>