• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Drzewa czerwono czarne crash programu

Object Storage Arubacloud
0 głosów
235 wizyt
pytanie zadane 24 lutego 2017 w C i C++ przez Jędrzej Dembowski Użytkownik (740 p.)
Witam, próbuję napisać implementację drzew czerwono czarnych w C, jednak po uruchomieniu funkcji dodawanie() program się wysypuje. Funkcja ta najpierw znajduje miejsce, w które ma włożyć nową wartość, a potem zostaje uruchomiona funkcja correct_tree, która ma za zadanie uporządkować drzewo zgodnie z trzema przypadkami. Swój kod opierałem o stronę http://eduinf.waw.pl/inf/alg/001_search/0121.php

Dostaję również warning

|105|warning: conflicting types for 'correct_tree' [enabled by default]|

|76|note: previous implicit declaration of 'correct_tree' was here|

To samo dotyczy funkcji Rot_L i Rot_R odpowiedzialne za rotację odpowiednich korzeni, jednak nie wiem dlaczego się one pojawiają. Być może to one są przyczyną tych crashy. Będę wdzięczny za wszelką pomoc, jeśli napisałem za mało informacji proszę o tym napisać.

mój kod : http://ideone.com/dGVtqO

1 odpowiedź

0 głosów
odpowiedź 24 lutego 2017 przez draghan VIP (106,230 p.)

Ja nie mogę, przez dobre pięć minut zastanawiałem się, co to jest ten "wezel". :) "Nigdy nie słyszałem o żadnym wezelu, o co chodzi...?" laugh Gdybyś pisał identyfikatory po angielsku, byłoby odrobinę wygodniej.

Zaznaczam, że nie analizowałem całości kodu. Tam, gdzie są wskaźniki, należy spodziewać się niespodziewanego, tak więc nie zdziwiłbym się, gdyby błędów było więcej.

Co do warningów jednak da się coś poradzić. Zacznij od deklaracji zapowiadającej funkcję correct_tree. Język C jest paskudny, jeśli chodzi o niezadeklarowane funkcje - jeśli mu coś nie pasuje z argumentem lub zrobi się literówkę (lub użyje funkcji, która nie została jeszcze zdefiniowana, a nie jest zapowiedziana) - kompilator sobie wyczarowuje pasującą mu funkcję z powietrza, która działa w sposób nieprzewidziany.

komentarz 24 lutego 2017 przez Jędrzej Dembowski Użytkownik (740 p.)
Tak warningi udało się usunąć, ale problem jednak został niezmieniony. Wezel to tylko nazwa zmiennej, rzeczywiście powinny być w języku angielskim, ale część kodu jest stara i dlatego część jest po angielsku, a część po polsku.
komentarz 24 lutego 2017 przez draghan VIP (106,230 p.)

Nie pisze się po polsku, to w złym stylu. A jeśli już, to na pewno nie mieszając polskiego z angielskim. Ale zostawmy to, bo to kwestia drugorzędna.

Odpaliłem debugger. Wyrzuca 'Segmentation fault' w funkcji correct_tree, w linii:

if(tmp->kolor == 'R') //przypadek 1

Przyczyną segfaulta jest przypisanie do tmp wartości:

start->rodzic->rodzic->p_syn

która w momencie drugiej iteracji w main() przy wywołaniu funkcji dodawanie() ma wartość NULL.

komentarz 24 lutego 2017 przez Jędrzej Dembowski Użytkownik (740 p.)

zmieniłem funkcje dodawanie na 

int dodawanie(int n, struct wezel *X)
{
    X->l_syn = &S;
    X->p_syn = &S;
    X->rodzic = root;
    X->wartosc = n;
    if(X->rodzic == &S) root = X;
    else
    while(true)
    {
        if(n<X->rodzic->wartosc)
        {
            if(X->rodzic->l_syn == &S)
            {
                X->rodzic->l_syn = X;
                break;
            }
            X->rodzic = X->rodzic->l_syn;
        }
        else
        {
            if(X->rodzic->p_syn == &S)
            {
                X->rodzic->p_syn = X;
                break;
            }
            X->rodzic = X->rodzic->p_syn;
        }

    }
    correct_tree(X);
}

i dodałem strażnika

void ustaw_straznika()
{
    S.kolor = 'B';
    S.rodzic = root;
    S.l_syn = &S;
    S.p_syn = &S;
    root = &S;
}

i przy wstawianiu już nie crashuje, ale nie moge teraz wyświetlić tego drzewa funkcją in_order_tree_walk, debugger wyrzuca błąd gdy uruchamiam in_order_tree_walk(start->l_syn);

co może być powodem? 

komentarz 25 lutego 2017 przez draghan VIP (106,230 p.)
Nie mam pojęcia. Pokaż kod, który otrzymałeś po swoich poprawkach.

Poza tym... czy Ty napisałeś całość tego kodu bez testowania poszczególnych funkcjonalności...?

Podobne pytania

0 głosów
1 odpowiedź 244 wizyt
pytanie zadane 19 kwietnia 2020 w C i C++ przez kiecam4 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 214 wizyt
pytanie zadane 25 grudnia 2015 w C i C++ przez Kubax96 Nowicjusz (170 p.)
0 głosów
2 odpowiedzi 137 wizyt
pytanie zadane 12 grudnia 2015 w C i C++ przez patryk16 Obywatel (1,080 p.)

92,548 zapytań

141,391 odpowiedzi

319,511 komentarzy

61,932 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...