Re: Formátovaný tisk bylo Re: sprintf - co delam blbe?
Martin Záruba
swz na volny.cz
Středa Duben 17 09:05:42 CEST 2024
Chápu, že to nejde. To volání tak, jak to píšete, zase vyžaduje další
parametr. Pokud by se buf nadefinovala jako statická, chodilo by to a
bylo by to jednoduché, ale funkce nebude reentrantní, což možná nevadí.
Udělat to tak, aby pole bylo ve volajícím modulu (což je asi nutný
předpoklad reentrantnosti) a současně ho nebylo třeba manuálně definovat
asi nejde. Je to jen takové duševní cvičení.
Martin Záruba
Dne 17.4.2024 v 8:46 Ladislav Vaiz napsal(a):
> Co alokujete funkcí malloc, to musíte uvolnit funkcí free. Myslel jsem
> to nějak takto:
>
> void Fultoa(char *buf, ...){
> // zrušit malloc
> }
>
> void volajici(){
> char buf[11];
>
> Fultoa((char *)buf, ...);
> Serial.print(buf);
> }
>
> Můžete ponechat i vracení char *, ale pak hrozí, že se ukazatel
> použije mimo platnost buf a bude ukazovat do cizí paměti. Takto se vám
> o to postará překladač.
>
> L.
>
>
> On 17.04.2024 8:32, Martin Záruba wrote:
>>
>> Takže takto? Je to opravdu kratší.
>>
>> char * Fultoa(uint32_t val,uint8_t length,uint8_t decimal) {
>> uint8_t ld1 = length - decimal - 1;
>> uint8_t ld2 = ld1 - 1;
>> char * buf = (char *)malloc(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;
>> }
>>
>> Jen mi není jasné, zda a kdy se pole buf na haldě uvolní.
>>
>> Martin Záruba
>> Dne 17.4.2024 v 8:08 Ladislav Vaiz napsal(a):
>>> On 17.04.2024 7:44, Martin Záruba wrote:
>>>> 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;
>>>> }
>>>
>>>
>>> V rámci testování bing chatu jsem mu zkusil zadat optimalizaci pro
>>> AVR. Navrhl místo Stringu vracet static char buf[11] definovaný ve
>>> funkci. U toho zmínil problém s vlákny (což na AVR nebude tak
>>> horké), k tomu navrhl řešení pomocí pole definovaného volajícím a
>>> předávaného funkci.
>>>
>>> To poslední mi připadne nejlepší. Vyhnete se režiji Stringu a buffer
>>> bude alokován, jen když ho volající bude potřebovat.
>>>
>>> L.
>>>
>>> _______________________________________________
>>> HW-list mailing list - sponsored by www.HW.cz
>>> Hw-list na list.hw.cz
>>> http://list.hw.cz/mailman/listinfo/hw-list
>>
>> _______________________________________________
>> HW-list mailing list - sponsored bywww.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>
>
>
> _______________________________________________
> 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/361ab70c/attachment.htm>
Další informace o konferenci Hw-list