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