přejít na obsah přejít na navigaci

Linux E X P R E S

Příspěvky Programovanie v jazyku C++: knižnica string – funkcie substr a pop_back

Programovanie v jazyku C++: knižnica string – funkcie substr a pop_back
J.D. 24. 06. 2019, 16:41:09
Odpovědět  Odkaz 
V cyklu 3. příkladu dochází ke čtení z nepřidělené paměti. V momentě, kdy po inkrementaci je proměnná i > (size / 2), je už znak retazec1[i] (a všechny následující znaky v řetězci) smazaný. U mě to způsobuje runtime chybu a pád programu. Stačí ale smazat podmínku if a upravit podmínku v těle cykly na for(size_t i = 0; i < (size - 1); i++) a program poběží správně.
Eduard Boldižár Re: Programovanie v jazyku C++: knižnica string – funkcie substr a pop_back
Eduard Boldižár 24. 06. 2019, 19:26:38
Odpovědět  Odkaz 
Áno, už vidím bug. Problém nastal kvôli pomenovaniu premennej size_t size. Keďže funkcia size je predvolená funkcia, čiže v editoroch zvykne byť farebne odlíšená, takže sa nesmie pomenovať premenná podľa predvolenej funkcie. Je to moja chyba, že som to tak pomenoval a nevšimol si to. A zákernosť tejto chyby je obrovská, keďže u mnohých systémov prejde bez problémov, ale vo Vašom prípade evidentne neprešlo. Ospravedlňujem sa a dúfam, že nič vážne sa nestalo :)
Oprava je jednoduchá, pomenovať premennú napr. na size1. Opravím to i ja v kóde.
Re: Re: Programovanie v jazyku C++: knižnica string – funkcie substr a pop_back
J.D. 25. 06. 2019, 20:47:18
Odpovědět  Odkaz 
Pojmenování proměnné je jiná věc. Měl jsem na mysli to, že proměnná i se postupně inkrementuje až na hodnotu velikosti puvodního řetězce, přičemž se čte znak řetězce na indexu i. Zároveň se ale v každém průchodu cyklem maže poslední znak řetězce, takže se řetězec neustále zkracuje. Ve výsledku v momentě, kdy by se mělo číst ze druhé půlky původního řetězce, tyto znaky už jsou smazané (čte se z paměti, která leží až za posledním znakem řetězce).
Eduard Boldižár Re: Re: Re: Programovanie v jazyku C++: knižnica string – funkcie substr a pop_back
Eduard Boldižár 26. 06. 2019, 00:29:37
Odpovědět  Odkaz 
Áno, máte pravdu. Vskutku, veľmi zaujímavý bug. Keby som miesto vytvorenia premennej s názvom size napísal do cyklu niečo také: for(size_t i = 0; i < retazec1.size(); i++) tak si hneď všimnem, že je niečo zle. A to preto, lebo by sa pri každej novej iterácii cyklu for aktualizovala veľkosť reťazca. Lenže ja som si neuvedomil, že som tú veľkosť dal formou premennej a žiadna aktualizácia cyklu nikdy neprebehne.
Riešenie problému je zmazať premennú size a zmeniť podmienky cyklu na:
for(size_t i = retazec1.size()-1; i >= 0 && i
Eduard Boldižár Programovanie v jazyku C++: knižnica string – funkcie substr a pop_back
Eduard Boldižár 26. 06. 2019, 00:57:36
Odpovědět  Odkaz 
Ospravedlňujem sa, ale nedá mi pridať správu, nejak to buglo :(
Eduard Boldižár Programovanie v jazyku C++: knižnica string – funkcie substr a pop_back
Eduard Boldižár 26. 06. 2019, 00:59:33
Odpovědět  Odkaz 
Riešenie je for(size_t i = retazec1.size()-1; i >= 0 && i
Eduard Boldižár Programovanie v jazyku C++: knižnica string – funkcie substr a pop_back
Eduard Boldižár 26. 06. 2019, 10:23:43
Odpovědět  Odkaz 
Kód bol aktualizovaný. Pridal som novú podmienku, aby pri poslednej iterácii hodnota premennej i nebola unsigned MAX_INT a cyklus by tak nikdy neskončil.
Vďaka za nájdenie bugu ;)
Programovanie v jazyku C++: knižnica string – funkcie substr a pop_back
Moje jmeno 28. 06. 2019, 14:58:46
Odpovědět  Odkaz 
'i >= 0'? Pro size_t?
Eduard Boldižár Re: Programovanie v jazyku C++: knižnica string – funkcie substr a pop_back
Eduard Boldižár 30. 06. 2019, 18:21:09
Odpovědět  Odkaz 
Keď sa tak zamyslím, áno, podmienka je zbytočná. Ale nechám to tak, pretože aj s touto podmienkou je celkovo tento algoritmus ťažkopádny a aspoň budú mať nováčikovia nápovedu, ako bol algoritmus zamýšľaný a že má skončiť po spracovaní prvku na nultej pozícii.
Ďakujem za reakciu :)