Formatovany tisk pro 8bit

Pavel Hudeček edizon na seznam.cz
Pátek Duben 19 20:50:48 CEST 2024


Moc pěkný.
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.

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).

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.

PH

Dne 19.04.2024 v 19:23 Martin Záruba napsal(a):
> 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:
>
> Výpis na požadovaný počet míst s možností textu před i za číslem.
>
> Potlačení nevýznamných nul.
>
> Co nejúspornější kód jak funkce, tak volání, vhodný pro malinky procesor.
>
> Přímý tisk bez nutnosti psaní Serial.print();
>
> Vyrobil jsem toto, posuďte a navrhněte prosím co by ještě šlo líp.
>
>
> void pr(int32_t h, const char* f) {
>   char buf[100];
>   uint8_t i = 0xFF;
>   int32_t x = abs(h);
>   do {
>     i++;
>     buf[i] = f[i];
>   } while (f[i] != 0);
>
>   do {
>     i--;
>     if (buf[i] == '#') {
>       if (x != 0) {
>         buf[i] = x % 10 + (uint8_t)'0';
>         if (h < 0 && x < 10) {
>           i--;
>           buf[i] = '-';
>         }
>       } else {
>         buf[i] = ' ';
>       }
>       x /= 10;
>     }
>   } while (i != 0);
>   Serial.print(buf);
> }
>
>
> Funkce má jediný formátovací znak #
>
> Příklady:
>
> int32_t napetimV = 5432;
> pr(napetimV, "Pokus1=###.###V\n");
> pr(-21,      "Pokus2=### zaporne cislo\n");
> pr(9876543,  "Pokus3=# ### ### cislo s mezerami po 1000\n");
> float a = 54.3;
> pr(a*10,     "Pokus4=####.# vypis float na 1 desetinne misto\n");
>
> Výsledek vypadá takto:
>
> Pokus1=  5.432V
> Pokus2=-21 zaporne cislo
> Pokus3=9 876 543 cislo s mezerami po 1000
> Pokus4=   54.3 vypis float na 1 desetinne misto



Další informace o konferenci Hw-list