Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Pzepisanie elemntu kolejki do obiektu.

Ostatnio zmodyfikowano 2011-01-29 15:52
Autor Wiadomość
Leniwy
Temat założony przez niniejszego użytkownika
» 2011-01-29 13:39:31
C/C++
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>
#include <queue>
#include <map>
#include <cstdio>

using namespace std;

class Huff {
public:
    int ile; // licznik wystąpień
    char co; // zmiena przecowywujaca znak
    Huff * left; // lewy syn
    Huff * right; // prawy syn
   
public:
    Huff() { };
    Huff( int i, char j ) {
        this->ile = i;
        this->co = j;
        this->left = NULL;
        this->right = NULL;
    }
   
    friend bool operator <( const Huff & x, const Huff & y ) {
        if( x.ile > y.ile )
             return true;
        else
             return false;
       
    }
   
};

// ----- * Funkcja: ZnajdzDroge * -----
// Zunkcja przechodzi rekurencyjnie po drzewie kodowym zapamiętując dorgę
// ,aż do momętu gdy dojdzie do liścia (węzła bez dzieci). Wtedy następuje
// Przepisanie drogi do kontenera map na klucz etykiety.
void ZnajdzDroge( Huff * R, string str, map < char, string > jp ) {
    string pom = str;
    char x;
    if( R->left == NULL && R->right == NULL ) {
        x = R->co;
        jp[ x ] = str;
    } else {
        pom.append( "0" );
        ZnajdzDroge( R->left, pom, jp );
        pom = str;
        pom.append( "1" );
        ZnajdzDroge( R->right, pom, jp );
    }
}; // ZnajdzDroge


int main() {
   
    // ----- * Zliczanie znaków w pliku text.txt * -----
    int ASCII[ 128 ] = { 0 }; // Tablica używana przy zliczania znaków
    FILE * plik;
    char znak;
    int pom;
    plik = fopen( "text.txt", "r" );
    if( plik == NULL ) {
        cout << "Brak pliku text.txt! \a" << endl << endl;
    } else {
        cout << "Wczytany tekst:" << endl;
        while( !feof( plik ) ) {
            fscanf( plik, "%c", & znak );
            printf( "%c", znak );
            pom =( int ) znak;
            ASCII[ pom ] += 1;
        };
        cout << endl << endl;
    };
    fclose( plik );
   
    // ----- * Wypełnianie kolejki prioretytowej * -----
    priority_queue < Huff * > PQ; // Deklaracja kolejki
    for( int i = 0; i < 128; i++ ) {
        Huff * wsk;
        wsk = new Huff( ASCII[ i ],( char ) i );
        if( ASCII[ i ] != 0 ) PQ.push( wsk );
       
    };
    cout << " Kolejka utworzona" << endl << endl;
   
    // ----- * Budowa drzewa kodowego Huffmana * -----
    Huff * pomo, * Root;
    while( !PQ.empty() ) {
        pomo->left = PQ.top();
        PQ.pop();
        pomo->right = PQ.top();
        PQ.pop();
        pomo->ile = pomo->left->ile + pomo->right->ile;
        PQ.push( pomo );
        Root = pomo;
    };
    cout << " Drzewo zbudowane" << endl << endl;
   
    // ----- * Budowa tablicy z kodami * -----       
    map < char, string > Kod; // struktura przechowywujaca kody
    string Droga = "";
    ZnajdzDroge( Root, Droga, Kod );
    cout << " Zbudowano tablice z kodem" << endl << endl;
   
    // ----- * Zapisywanie drzewa do Pliku * -----
    map < char, string >::iterator it; // iterator map'y
    FILE * PlikKod;
    PlikKod = fopen( "kod.huf", "w" );
    for( it = Kod.begin(); it != Kod.end(); it++ ) {
        cout <<( * it ).first << " => " <<( * it ).second << endl;
        fprintf( PlikKod, "%d %s",( int )( * it ).first,( * it ).second.c_str() );
    };
    fclose( PlikKod );
    cout << " Zapisano kod" << endl << endl;
   
    // ----- * Kodowanie tekstu * -----   
    FILE * plik1, * plik2;
    char * tab;
    plik1 = fopen( "text.txt", "r" );
    plik2 = fopen( "text.huf", "w" );
    if( plik1 == NULL ) {
        cout << "Brak pliku text.txt! \a" << endl << endl;
    } else {
        while( !feof( plik1 ) ) {
            fscanf( plik1, "%c", & znak );
            char * tab = new char[ Kod[ znak ].size() + 1 ];
            strcpy( tab, Kod[ znak ].c_str() );
            fprintf( plik2, tab );
        }
    }
    fclose( plik2 );
    fclose( plik1 );
    cout << " Zapisano zakdowany plik" << endl << endl;
   
    cout << " Koniec" << endl << endl;
    system( "PAUSE" );
    return EXIT_SUCCESS;
} // main

I znowu potrzebuje waszej pomocy.
Dopisałem resztę programu i wszytko się ładnie kompiluje, ale po zbudowaniu drzewa Windows wyrzuca jakiś błąd.
Nie pisze jaki, tylko że jak znajdą rozwiązanie to mnie poinformują ...

Obstawiam, że to coś w ZnajdzDroge jest nie tak, ale nie wiem co :/
P-27399
szyx_yankez
» 2011-01-29 13:45:17
Uruchom debuger, i znajdziesz przyczynę błędu.
P-27400
Leniwy
Temat założony przez niniejszego użytkownika
» 2011-01-29 15:01:39
Nie może znaleźć wartości R i Root, dodatkowo Błąd Segmentacji... Jak to naprawić? R i Root są przekazywane, nie wiem co mu się nie podoba :/
P-27411
szyx_yankez
» 2011-01-29 15:14:52
Tak:
C/C++
Huff * pomo, * Root = new Huff;
P-27414
Leniwy
Temat założony przez niniejszego użytkownika
» 2011-01-29 15:52:53
Z każdą linikją kodu dochodz do wniosku że programowanie w C++ nie jest mi pisane :/
Ciągle jest błąd segmentacji i teraz mam:
this->left=?
return=?
Could not watch this variable

Może mi ktoś w łopatologiczny sposób wyjaśnić o co w tym chodzi?

Jeszcze rzeczą która mnie ciekawi to dlaczego Bebuger zaznaczył mi linie:
Huff() { };
P-27417
1 2 « 3 »
Poprzednia strona Strona 3 z 3