Programovanie v jazyku C++: knižnica string – funkcie substr a pop_back J.D.24. 06. 2019, 16:41:09 OdpovědětOdkaz
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ě.
Re: Programovanie v jazyku C++: knižnica string – funkcie substr a pop_back Eduard Boldižár24. 06. 2019, 19:26:38 OdpovědětOdkaz
Á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ětOdkaz
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).
Re: Re: Re: Programovanie v jazyku C++: knižnica string – funkcie substr a pop_back Eduard Boldižár26. 06. 2019, 00:29:37 OdpovědětOdkaz
Á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
Programovanie v jazyku C++: knižnica string – funkcie substr a pop_back Eduard Boldižár26. 06. 2019, 00:57:36 OdpovědětOdkaz
Ospravedlňujem sa, ale nedá mi pridať správu, nejak to buglo :(
Programovanie v jazyku C++: knižnica string – funkcie substr a pop_back Eduard Boldižár26. 06. 2019, 00:59:33 OdpovědětOdkaz
Riešenie je for(size_t i = retazec1.size()-1; i >= 0 && i
Programovanie v jazyku C++: knižnica string – funkcie substr a pop_back Eduard Boldižár26. 06. 2019, 10:23:43 OdpovědětOdkaz
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 jmeno28. 06. 2019, 14:58:46 OdpovědětOdkaz
'i >= 0'? Pro size_t?
Re: Programovanie v jazyku C++: knižnica string – funkcie substr a pop_back Eduard Boldižár30. 06. 2019, 18:21:09 OdpovědětOdkaz
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 :)