Re: Formátovaný tisk bylo Re: sprintf - co delam blbe?

Martin Záruba swz na volny.cz
Středa Duben 17 07:44:48 CEST 2024


Ano, takto to bylo napsané.

Prosím, co by se tam mělo udělat jinak, popřípadě co je nešikovné, ač to 
funguje? Zkoušel jsem se vydovádět i přes pointry, ale nebylo to kratší 
a bylo to mnohem nepřehlednější (alespoň pro mě).

Jediné, co mě ještě napadlo je, že length - decimal - 1 a length - 
decimal - 2 je použito dvakrát a tak to uložit do proměnných. Program je 
pak o 20 byte kratší a asi i rychlejší (pokud to má význam).

Předpokládám, že ld1, ld2, buf, k, i se ukládají na zásobníku, takže 
nezabírají statickou paměť.

tedy takto:

String Fultoa(uint32_t val, uint8_t length, uint8_t decimal) {
   uint8_t ld1 = length - decimal - 1;
   uint8_t ld2 = ld1 - 1;
   char buf[11];
   uint32_t k=100;
   for (uint8_t i = 3;i < length; i++) k*=10;
   ultoa(val+k, buf, 10);
   for (uint8_t i = 0; i < ld2; i++) {
     if (buf[i + 1] == '0')
       buf[i] = ' ';
     else
       buf[i] = buf[i + 1];
   }
   buf[ld2] = buf[ld1];
   buf[ld1] = '.';
   return buf;
}


Já kdysi dělal docela složitý (no vzhledem k možnostem) program pro 
AT89C4051. Mělo to dvě přerušení a docela jsem se v assembleru 
vydováděl, když se mi data musela vejít do 128 Byte (program do 4kB byl 
v pohodě). Byla to moje první řídící jednotka pro tepelné čerpadlo a 
mělo to i ekvitermní regulaci. Teploty to četlo přes DS18B20.

Jinak u těch DS18B20 o kterých je většina konstruktérů přesvědčena, že 
nechodí na delším kabelu, jsem osciloskopem zjistil, že mu nevadí ani 
značná deformace pulzů, ale vadí mu záporné napětí vzniklé odrazem na 
dlouhém vedení. Stačilo ale dát antiparalelně ke každému teploměru 
schotkyho diodu a chodilo to s fantomovým napájením (tedy po dvou 
drátech) přes 200m nestíněnou dvoulinku.


Martin Záruba

Dne 16.4.2024 v 23:36 Jan Waclawek napsal(a):
> Ten program sa Vam formatovanim zmrsil
> https://list.hw.cz/pipermail/hw-list/2024-April/571392.html  , dovolil som
> si ho rekonstruovat:
>
> String Fultoa(uint32_t val,uint8_t length,uint8_t decimal) {
>     char buf[11];
>     uint32_t k=100;
>     for (uint8_t i = 3;i < length; i++) k*=10;
>     ultoa(val+k, buf, 10);
>     for (uint8_t i = 0; i < length - decimal - 2; i++) {
>        if (buf[i + 1] == '0')
>           buf[i] = ' ';
>        else
>           buf[i] = buf[i + 1];
>     }
>     buf[length - decimal - 2] = buf[length - decimal - 1];
>     buf[length - decimal - 1] = '.';
>     return buf;
> }
>
> Serial.println(Fultoa(1,10,3));
> Serial.println(Fultoa(987654321,10,2));
> Serial.println(Fultoa(21,3,1));
>
>
> Nepouzivam C++. V C by to fungovalo len nahodou kvoli lokalnemu buffru.
>
> Miestni C++ guruovia prosim vysvetlite ako to instancovanie/deinstancovanie
> objektu triedy String tu funguje.
>
> wek
>
> _______________________________________________
> HW-list mailing list  -  sponsored bywww.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20240417/ccf5c76e/attachment.htm>


Další informace o konferenci Hw-list