Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
Silenoz Forumaš(ica)
Pridružen/a: 15. 10. 2011. (18:45:11) Postovi: (4F)16
Spol:
|
Postano: 3:57 čet, 28. 11. 2013 Naslov: |
|
|
Uspio sam doci do tu (tj vidjeti gdje je problem), ali sada me zafrkaje i roditelj, jednostavno se unutra 'polomi' negdje u rekurziji. Toliko cesto crkava na alokaciji da do ovoga "pravog" problema dodem svaki ko-zna-koji-put. Sad mi je sve teze i teze proci kroz alokacije uopce (pretpostavljam da sam si ubio memoriju bez free() ).
Imam ideju rješenja zadržati onu formu i provjeravati da li je to korijen stabla prije nego trazim roditelja sa
[code:1]if (BiParent(P,T)!=LAMBDA)
P=BiParent(P,T);[/code:1]
A onda se dogodi da jedva dode do tog dijela, a kad dode 80% slucajeva se zbrejka u petlji roditelja (sto vise ovih BiMakeNull-ova i malloca ima, to sve cesce pada ranije). I tako ja nikako ne mogu docekat 'obicno' pucanje na racun glavne funkcije s tim kodom. valjda preko sat pokusavam i sad mozgam sto ne valja s implementacijom da se stalno rusi [u]na alokaciji[/u] O.o
restartao sam komp, uzeo ovaj stari kod, vratio uvijete koji 'nisu valjali' uz ovaj dodatak (ako je cvor korijen vise ne ide 'uzbrdo' i ne dobiva lambdu ko roditelja). do sad samo na alociranju izbacuje. rjesenja dobro ispadaju ali stvarno precesto ispada.
Uspio sam doci do tu (tj vidjeti gdje je problem), ali sada me zafrkaje i roditelj, jednostavno se unutra 'polomi' negdje u rekurziji. Toliko cesto crkava na alokaciji da do ovoga "pravog" problema dodem svaki ko-zna-koji-put. Sad mi je sve teze i teze proci kroz alokacije uopce (pretpostavljam da sam si ubio memoriju bez free() ).
Imam ideju rješenja zadržati onu formu i provjeravati da li je to korijen stabla prije nego trazim roditelja sa
Kod: | if (BiParent(P,T)!=LAMBDA)
P=BiParent(P,T); |
A onda se dogodi da jedva dode do tog dijela, a kad dode 80% slucajeva se zbrejka u petlji roditelja (sto vise ovih BiMakeNull-ova i malloca ima, to sve cesce pada ranije). I tako ja nikako ne mogu docekat 'obicno' pucanje na racun glavne funkcije s tim kodom. valjda preko sat pokusavam i sad mozgam sto ne valja s implementacijom da se stalno rusi na alokaciji O.o
restartao sam komp, uzeo ovaj stari kod, vratio uvijete koji 'nisu valjali' uz ovaj dodatak (ako je cvor korijen vise ne ide 'uzbrdo' i ne dobiva lambdu ko roditelja). do sad samo na alociranju izbacuje. rjesenja dobro ispadaju ali stvarno precesto ispada.
Zadnja promjena: Silenoz; 4:17 čet, 28. 11. 2013; ukupno mijenjano 1 put.
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
|
[Vrh] |
|
Silenoz Forumaš(ica)
Pridružen/a: 15. 10. 2011. (18:45:11) Postovi: (4F)16
Spol:
|
Postano: 4:26 čet, 28. 11. 2013 Naslov: |
|
|
[quote="vsego"]Gledam malo po kodu...
[tt]BiDelete[/tt] nece dobro raditi za korijen i za ne-listove.
[tt]Unos[/tt] mi nije jasan. Ako lijevo dijete ne postoji, ubaci tamo novi znak (operator ili operand, svejedno). Onda nastavi ulaz za to lijevo dijete. Nece li onda sve biti dodatno kao lijevo dijete? (sorry ako sam nesto fulao; umor radi svoje)
Trenutno nemam inspiracije sto bi jos moglo biti krivo. Nadam se da ce ovo pomoci.[/quote]
Da, BiDelete je neposoban (ne koristim ga uopce), ali tako je definiran u salabahteru a mi moramo napraviti implementaciju po salabahteru.
[quote]void BiDelete(node i,BinaryTree *Tp) . . . funkcija izbacuje list i iz binarnog stabla *Tp. [u]Nije definirana[/u] ako i ne pripada *Tp ili [u]ako i ima djece[/u][/quote]
Unos ima dva dijela. Prvi je ako je znak tj operator, onda nastavlja dalje po lijevoj strani jer znak uvijek ima dva djeteta (zadane su mi 3 binarne operacije kao moguce). ako je operand (dakle neko slovo) onda ako moze lijevo pise lijevo i ostaje, inace desno i 'vraca se' do prvog slobodnog desnog ili korijena (ako je korijen zavrsava unos).
Za sad jedino znam da se rusi na tim alokacijama. I sa ovim 'novim' dijelom koji pazi da parent nikad ne bude null.. A dok ga nije bilo, opet se puno cesce rusio na alokacijama nego na null-roditelju (makar, nije mi jasno zasto uvijek nije vracao null, ocekivao bih da za isti unos i iste naredbe isto prolazi petlje i uvijek vrijedi ista logika).
Skroz kuzim za umor - takoder jedva gledam. Hvala na pokusajima uopce, cijenim to.
vsego (napisa): | Gledam malo po kodu...
BiDelete nece dobro raditi za korijen i za ne-listove.
Unos mi nije jasan. Ako lijevo dijete ne postoji, ubaci tamo novi znak (operator ili operand, svejedno). Onda nastavi ulaz za to lijevo dijete. Nece li onda sve biti dodatno kao lijevo dijete? (sorry ako sam nesto fulao; umor radi svoje)
Trenutno nemam inspiracije sto bi jos moglo biti krivo. Nadam se da ce ovo pomoci. |
Da, BiDelete je neposoban (ne koristim ga uopce), ali tako je definiran u salabahteru a mi moramo napraviti implementaciju po salabahteru.
Citat: | void BiDelete(node i,BinaryTree *Tp) . . . funkcija izbacuje list i iz binarnog stabla *Tp. Nije definirana ako i ne pripada *Tp ili ako i ima djece |
Unos ima dva dijela. Prvi je ako je znak tj operator, onda nastavlja dalje po lijevoj strani jer znak uvijek ima dva djeteta (zadane su mi 3 binarne operacije kao moguce). ako je operand (dakle neko slovo) onda ako moze lijevo pise lijevo i ostaje, inace desno i 'vraca se' do prvog slobodnog desnog ili korijena (ako je korijen zavrsava unos).
Za sad jedino znam da se rusi na tim alokacijama. I sa ovim 'novim' dijelom koji pazi da parent nikad ne bude null.. A dok ga nije bilo, opet se puno cesce rusio na alokacijama nego na null-roditelju (makar, nije mi jasno zasto uvijek nije vracao null, ocekivao bih da za isti unos i iste naredbe isto prolazi petlje i uvijek vrijedi ista logika).
Skroz kuzim za umor - takoder jedva gledam. Hvala na pokusajima uopce, cijenim to.
|
|
[Vrh] |
|
nuclear Forumaš(ica)
Pridružen/a: 13. 11. 2011. (17:40:12) Postovi: (74)16
Spol:
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
Postano: 12:10 čet, 28. 11. 2013 Naslov: |
|
|
@Silenoz:
Nasao sam. Problem je kad korijenu dodas desno dijete i onda krenes na roditelja (kojeg korijen nema). To radis u [tt]do { ... } while[/tt] petlji, sto se jednom nuzno izvede, a u slucaju [tt]P = korijen[/tt] ne smije niti jednom.
Zamijeni [tt]do { ... } while[/tt] s [tt]while { ... }[/tt], pa bi ti trebalo raditi. Moj test primjer je kao i u prethodnom postu.
Ako zelis izmijenjeni kod (s dodatnim ispisima s kojima sam to nasao), javi se na PM, da ne lijepim ovdje tako velike kodove.
[quote="Silenoz"]ocekivao bih da za isti unos i iste naredbe isto prolazi petlje i uvijek vrijedi ista logika[/quote]
Ne. Kad napravis nesto ilegalno s pointerima, onda rezultat vise nije nuzno deterministicki, jer ne ovisi samo o tvojim varijablama.
@Silenoz:
Nasao sam. Problem je kad korijenu dodas desno dijete i onda krenes na roditelja (kojeg korijen nema). To radis u do { ... } while petlji, sto se jednom nuzno izvede, a u slucaju P = korijen ne smije niti jednom.
Zamijeni do { ... } while s while { ... }, pa bi ti trebalo raditi. Moj test primjer je kao i u prethodnom postu.
Ako zelis izmijenjeni kod (s dodatnim ispisima s kojima sam to nasao), javi se na PM, da ne lijepim ovdje tako velike kodove.
Silenoz (napisa): | ocekivao bih da za isti unos i iste naredbe isto prolazi petlje i uvijek vrijedi ista logika |
Ne. Kad napravis nesto ilegalno s pointerima, onda rezultat vise nije nuzno deterministicki, jer ne ovisi samo o tvojim varijablama.
_________________ U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
|
|
[Vrh] |
|
_eternity Forumaš(ica)
Pridružen/a: 08. 01. 2012. (13:53:51) Postovi: (8)16
|
|
[Vrh] |
|
Shirohige Forumaš(ica)
Pridružen/a: 16. 11. 2012. (20:19:56) Postovi: (ED)16
Spol:
|
|
[Vrh] |
|
|