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