Leniwy Temat założony przez niniejszego użytkownika |
» 2011-01-29 13:39:31 #include <cstdlib> #include <iostream> #include <fstream> #include <string> #include <queue> #include <map> #include <cstdio>
using namespace std;
class Huff { public: int ile; char co; Huff * left; Huff * right; 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; } };
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 ); } };
int main() { int ASCII[ 128 ] = { 0 }; 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 ); priority_queue < Huff * > PQ; 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; 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; map < char, string > Kod; string Droga = ""; ZnajdzDroge( Root, Droga, Kod ); cout << " Zbudowano tablice z kodem" << endl << endl; map < char, string >::iterator it; 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; 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; }
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 :/ |
|
szyx_yankez |
» 2011-01-29 13:45:17 Uruchom debuger, i znajdziesz przyczynę błędu. |
|
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 :/ |
|
szyx_yankez |
» 2011-01-29 15:14:52 Tak:
Huff * pomo, * Root = new Huff;
|
|
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() { }; |
|
1 2 « 3 » |