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

Miroslav Mraz mrazik na volny.cz
Středa Duben 17 13:19:48 CEST 2024


Mě zmátlo, že z toho tak jak to bylo napsané
String fnc (...) {
   char buf [11];
   // ...
   return buf;
}
není jasné, co to vlastně vrací. Pokud bych napsal
   return String(buf);
nemusel bych koukat do zdrojáků a bylo by to stejné. Anonymní String se 
instancuje voláním konstruktoru String(const char *cstr = ""). To je 
vše. Ano, překladač přeuspořádá zásobník, je to dost brutální, ale 
nemusíte se o to starat, dále se pak pracuje s kopií a její platnost 
končí na konci bloku, kde se používá.
Jakýkoli String v C++ je hrůza a je lepší se tomu pokud možno vyhnout.

Mrazík


On 17. 04. 24 12:29, Jan Waclawek wrote:
>> Arduino nepouľívám, takľe mi také není jasné jak to přesně funguje, ale
> 
> No ved je k dispozicii kompletna dokuemntacia.. ;-)
> https://github.com/arduino/ArduinoCore-API/blob/master/api/String.h
> https://github.com/arduino/ArduinoCore-API/blob/master/api/String.cpp
> 
> Ale bez ohladu na to, kedze C++ nepouzivam a nepoznam, tak mi nie je jasne,
> ako a kedy sa ten anonymny objekt, ktory je nasledkom pouzitia triedy ako
> navratoveho typu, instancuje; resp. co je na zasobniku v akom poradi a
> akym sposobom a v ktorom okamihu sa tam ten buffer prenesie.
> 
> Zaujima ma to preto, lebo toto je dost casty problem, kde by som chcel, aby
> nejaku pamat alokovala "leaf" funkcia a aby sa po jej "pouziti"
> automaticky ta pamat dealokovala. Tak ma zaujima, ako to ten C++ skutocne
> robi.
> 
>> Jde to sice takhle dělat i v čistém C, ale není to zvykem.
> 
> Neviem, ako by som v cistom C zabezpecil zivotnost toho buffra dlhsie ako
> je koniec funkcie, v ktorom bol definovany, a ako by som zabezpecil, aby
> po pouziti bol ten buffer "dealokovany". V asm si viem predstavit, ze by
> som pri navrate z tej funkcie preusporiadal zasobnik, ale pripada mi to
> dost brutalne.
> 
> wek


Další informace o konferenci Hw-list