Problem z tablicą obiektów (segmentation fault)

0
char c;
 cTree list[256];
    int real_size_list = 0;
[...........]
<font color="brown">list[real_size_list] = cTree (c);</font>

Segmentation fault mam dokładnie przy linijce na brazowo
Troche mojej klasy zeby wszystko bylo jasne

class cTree
{
    typedef struct node
    {
        char symbol;
        bool leaf; //1 - this node is a leaf
        node *next1;
        node *next2;
        node *prev;
        int number_node;
    };

public:
    node *root;
    int number;
    cTree(char);
    cTree();
    int inc_weight(char, node*);
    void merge(cTree, cTree);
    void show_tree(node*);
};

cTree::cTree()
{
};

cTree::cTree(char ch)
{
    root->leaf = 1;
    root->symbol = ch;
    root->next1 = NULL;
    root->next2 = NULL;
    root->prev = NULL;
    root->number_node = 1;
    number = 1;
}
[................]
}

Z gory dzieki wszystkim co pomoga mi namierzyc popelniany przeze mnie blad.
0

Z tego co widzę, to składnik root jest NULLem, a w konstruktorze cTree(char) odnosisz się do jego składników. Musisz jakoś zainicjalizować root przed jego użyciem. Nie do końca rozumiem po co Ci w ogóle root w każdym węźle drzewa, no chyba że ten "root" (korzeń) to tak naprawdę "parent" (rodzic).

0

Czemu root będzie w każdym węźle drzewa?? Czyżbym czegoś nie widział :)
Root jest składnikiem drzewa i tworzony ma być raz (przy inicjalizacji klasy). I nie do końca rozumiem jak mam zainicjować roota? Mógłbym się założyć, że już tak robiłem, ale sprawdze, bo być może się mylę

0
sq napisał(a)

Czemu root będzie w każdym węźle drzewa?? Czyżbym czegoś nie widział

Nie, to ja jestem ślepy i źle Ci powiedziałem -- przepraszam. Nie potrafię znaleźć innego wytłumaczenia niż losowe zwarcie w mózgownicy, czy też brak staranności w czytaniu kodu. Zakodowałem sobie w moim chorym umyśle ;), że cTree to jest jakieś cNode, a dopiero teraz widzę, że węzły reprezentuje ta zagnieżdżona struktura node, a cTree (jak sama nazwa wskazuje) to całe drzewo. To jest OK!

Architekturę masz więc w porządku, ale na szczęście/niestety pozostaje ten zidentyfikowany przeze mnie błąd.

No bo zobacz... W programie, w podświetlonej przez Ciebie linijce, odpalasz sobie konstruktor:

cTree::cTree(char ch);

I potem leci pierwsza linijka z ciała tego konstruktora:

    root->leaf = 1;

Ale jaką wartość ma w tym momencie składnik root? Gdzie go inicjalizowałeś? Musisz zainicjalizować go zanim zaczniesz grzebać przy jego składnikach. Bo tak to grzebiesz przy węźle (root), który jeszcze nawet nie istnieje.

Po prostu w pierwszej linijce konstruktora musisz zrobić root = new node();, ew. może lepiej zrobić to na liście inicjalizacyjnej.

0

Odpisuje dopiero dzisiaj, ale błąd zlokalizowałem zaraz po pierwszy Twoim poście.
Dawałem:
root->leaf = 1;
A przecież nie o to mi chodziło zresztą.
Poprawiłem na:

node a = new node;
root = a;
root->leaf = 1;

Dzieki za pomoc.
Pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1