<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<p><font face="Arial">Já to tak původně dělal, jenže byl to mnohem
složitější a vlastně můžete takto udělat jen část než narazíte
na první formátovací znak. Pak už je to stejně jen odeslání
čísla. protože nevíte, zda nebude následovat další formátovací
znak po libovolné počtu "výplní". Tvar text,val, míst se mi
nelíbil, protože s ním neuděláte třeba 10mV. Takto je text
kdekoli, dokonce je kdekoli i třeba \n, takže nemá smysl
println. A varinta txtPred, val, míst, txtPo to sice umí, ale
jsou 4 parametry a stejně nejde udělat třeba odskočené tisíce.
Taky se mi líbí, že to sežere i float. Předpokládím, že buffer
se vytvoří na zásobníku a po opuštění funkce zmizí. Je to tak?</font></p>
<p><font face="Arial">Ještě to chci doplnit o možnost mít
formátovací řetězec ve flash. Není mi ale jasné, jaký je rozdíl
mezi PSTR("V paměti flash") a F("V paměti flash"). Asi se mi víc
líbí F(" "), je to kratší zápis a dovoluje přetížení funkce. Ale
možná má nějakou nevýhodu, na kterou jsem nepřišel.<br>
</font></p>
<pre class="moz-signature" cols="72">Martin Záruba</pre>
<div class="moz-cite-prefix">Dne 19.4.2024 v 20:50 Pavel Hudeček
napsal(a):<br>
</div>
<blockquote type="cite"
cite="mid:b4bb63a0-c0e8-4e00-bb0f-836ae08e652c@seznam.cz">Moc
pěkný.
<br>
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.
<br>
<br>
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).
<br>
<br>
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.
<br>
<br>
PH
<br>
<br>
Dne 19.04.2024 v 19:23 Martin Záruba napsal(a):
<br>
<blockquote type="cite">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:
<br>
<br>
Výpis na požadovaný počet míst s možností textu před i za
číslem.
<br>
<br>
Potlačení nevýznamných nul.
<br>
<br>
Co nejúspornější kód jak funkce, tak volání, vhodný pro malinky
procesor.
<br>
<br>
Přímý tisk bez nutnosti psaní Serial.print();
<br>
<br>
Vyrobil jsem toto, posuďte a navrhněte prosím co by ještě šlo
líp.
<br>
<br>
<br>
void pr(int32_t h, const char* f) {
<br>
char buf[100];
<br>
uint8_t i = 0xFF;
<br>
int32_t x = abs(h);
<br>
do {
<br>
i++;
<br>
buf[i] = f[i];
<br>
} while (f[i] != 0);
<br>
<br>
do {
<br>
i--;
<br>
if (buf[i] == '#') {
<br>
if (x != 0) {
<br>
buf[i] = x % 10 + (uint8_t)'0';
<br>
if (h < 0 && x < 10) {
<br>
i--;
<br>
buf[i] = '-';
<br>
}
<br>
} else {
<br>
buf[i] = ' ';
<br>
}
<br>
x /= 10;
<br>
}
<br>
} while (i != 0);
<br>
Serial.print(buf);
<br>
}
<br>
<br>
<br>
Funkce má jediný formátovací znak #
<br>
<br>
Příklady:
<br>
<br>
int32_t napetimV = 5432;
<br>
pr(napetimV, "Pokus1=###.###V\n");
<br>
pr(-21, "Pokus2=### zaporne cislo\n");
<br>
pr(9876543, "Pokus3=# ### ### cislo s mezerami po 1000\n");
<br>
float a = 54.3;
<br>
pr(a*10, "Pokus4=####.# vypis float na 1 desetinne
misto\n");
<br>
<br>
Výsledek vypadá takto:
<br>
<br>
Pokus1= 5.432V
<br>
Pokus2=-21 zaporne cislo
<br>
Pokus3=9 876 543 cislo s mezerami po 1000
<br>
Pokus4= 54.3 vypis float na 1 desetinne misto
<br>
</blockquote>
<br>
_______________________________________________
<br>
HW-list mailing list - sponsored by <a class="moz-txt-link-abbreviated" href="http://www.HW.cz">www.HW.cz</a>
<br>
<a class="moz-txt-link-abbreviated" href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a>
<br>
<a class="moz-txt-link-freetext" href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a>
<br>
</blockquote>
</body>
</html>