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