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

Przeszukanie drzewa binarnego - zwrot tablicy, lub wskaźnika na tablicę(huffman)

Object Storage Arubacloud
0 głosów
242 wizyt
pytanie zadane 6 maja 2018 w C i C++ przez GoRo3 Obywatel (1,640 p.)

Cześć

Mam nadzieję, że tutaj znajdę pomoc, bo od kilku dni głowie się nad problemem i nie mogę sobie poradzić.

Tworzę projekt kodowania huffmana i wykorzystuje do tego drzewo binarne. Jak na razie wszystko szło w miarę gładko, tzn udało mi się stworzyć listę korzeni oraz później z korzeni zrobić drzewo. Mam też funkcję, która wypisuje kod każdej litery w drzewie - przechodząca przez drzewo aż znajdzie odpowiednią literę i wypisuje jej kod. Kod litery jest tworzony poprzez dodanie cyfry 0 lub 1 do łańcucha znaków w zależności czy idziemy do lewego korzenia czy do prawego - funkcja jest rekurencyjna.

void pokaz_drzewo(list *temp, char *ch)
{
    int len_buff = strlen(ch);
    char buff[len_buff];

    if (!temp->node->lewy)
    {
        printf("znak: %c, kod:%s \n", temp->node->znak, ch);
    }
    if (temp->node->lewy != NULL)
    {
        strcpy(buff, ch);
        char_append(buff, '0');
        pokaz_drzewo((void *)temp->node->lewy, buff);
    }
    if (temp->node->prawy != NULL)
    {
        strcpy(buff, ch);
        char_append(buff, '1');
        pokaz_drzewo((void *)temp->node->prawy, buff);
    }

Problem narodził się jak chciałem pozbyć się prymitywnego "printf" jako wynik funkcji, a owy wynik zapisać do zewnętrznego C-stringa.

Stworzyłem sobie funkcję nadrzędną "koduj_wiadomość":

void koduj_wiadomosc(list *root, char msg[])
{
    char zakodowany_znak[10] = "";

    for (int i = 0; i < strlen(msg) - 1; i++)
    {
        koduj_znak(root, msg[i],"", zakodowany_znak);
        printf("%s\n", zakodowany_znak);
    }
}

W której wywołuje funkcję podrzędną "koduj_znak":

void koduj_znak(list *root, char ch, char *tmp,char *kod)
{
    int len_buff = strlen(tmp);
    char buff[len_buff];

    if (root->node)
    {
        if (root->node->lewy)
        {
            strcpy(buff, tmp);
            char_append(buff, '0');
            koduj_znak((void *)root->node->lewy, ch, buff,kod);
        }
        if (root->node->prawy)
        {
            strcpy(buff, tmp);
            char_append(buff, '1');
            koduj_znak((void *)root->node->prawy, ch, buff,kod);
        }
    }
     if (root->node->znak == ch)
    {
        printf("%s\n", tmp);
        strcpy(tmp,kod);
        return;
    }
}

Założenie jest takie aby funkcja "koduj znak" zapisała do przekazanej tablicy odpowiedni ciąg C-stringa. Później sobie ten ciąg jeszcze będę przetwarzał. Jednak niestety co bym nie próbował to nie mogę skopiować C-stringa stworzonego w wyniku działania funkcji do tablicy. Próbowałem też używać malloca ale ostatecznie funkcja zwracała adres 0x1 i wywalało bład. Próbowałem podpisać debuggera ale zauważyłem to co już wiedziałem, czyli "strcp" nie kopiuje wartości z jednej tablicy do drugiej.

Pewnie coś nie tak ustawiłem na wskaźnikach ale moja wiedza już się skończyła i nie wiem jak z tego wybrnąć.

Proszę o pomoc bo już rew włosy z głowy ;)

Pozdrawiam

G!

1 odpowiedź

0 głosów
odpowiedź 6 maja 2018 przez j23 Mędrzec (194,920 p.)

W koduj_wiadomosc w trzecim argumencie koduj_znak dajesz pusty łańcuch "". We wnętrzu koduj_znak masz coś takiego:
 

strcpy(tmp, kod);

gdzie tmp to ten trzeci argument. Piszesz po pamięci, która nie dość, że jest za mała (1 bajt), to jeszcze jest read-only. To jest źle.

 

W koduj_znak bufor buff  jest za mały (i chyba zbędny).

Podobne pytania

0 głosów
2 odpowiedzi 1,131 wizyt
pytanie zadane 17 stycznia 2018 w C i C++ przez k222 Nałogowiec (30,150 p.)
0 głosów
2 odpowiedzi 689 wizyt
pytanie zadane 24 sierpnia 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 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!

...