Formatovany tisk pro 8bit

Martin Záruba swz na volny.cz
Pátek Duben 19 19:23:12 CEST 2024


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

Martin Záruba



Další informace o konferenci Hw-list