Formatovany tisk pro 8bit
Petr Labaj
labaj na volny.cz
Sobota Duben 20 18:28:21 CEST 2024
Za sebe můžu říct, že se mi to Vaše pojetí s formátovacím řetězcem líbí.
Asi bych tam trochu šetřil s buffery, ale to je drobnost.
Já to skládám 3 voláními (text, číslo, text), ale takhle je to docela
elegantní.
PL
******************
Dne 19.4.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