Leniwy Temat założony przez niniejszego użytkownika |
Pzepisanie elemntu kolejki do obiektu. » 2011-01-27 17:09:23 Witam, #include <cstdlib> #include <iostream> #include <string> #include <queue>
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; } Huff & operator =( Huff & y ) { this->co = y.co; this->ile = y.ile; this->left = y.left; this->right = y.right; return * this; } };
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++ ) { if( ASCII[ i ] != 0 ) PQ.push( Huff( ASCII[ i ],( char ) i ) ); }; 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 ); }; system( "PAUSE" ); return EXIT_SUCCESS; }
Moje problemy zaczynają się przy budowie drzewa. Szczerze to już nie mam pomysłu o co chodzi. Wstawiłem taką wersję jaka mi się wydaje najbliżej poprawnej. Oto błędy jakie mi produkuje: In function ` int main() ': 73 cannot convert ` const Huff ' to `Huff*' in assignment 75 cannot convert ` const Huff ' to `Huff*' in assignment 77 ` ile ' has not been declared 77 request for member of non - aggregate type before '+' token 77 ` ile ' has not been declared 77 request for member of non - aggregate type before ';' token Możecie mi wyjaśnić co tu jest nie tak? z góry dziękuję :)[/i] |
|
McAffey |
» 2011-01-27 17:57:37 Wstaw kod w tagi cpp ( (cpp)...(/cpp) tylko nawiasy kwadratowe), będzie czytelniej. |
|
Leniwy Temat założony przez niniejszego użytkownika |
» 2011-01-27 18:16:37 I jak? jest ktoś w tanie mi pomóc? |
|
malan |
» 2011-01-27 18:27:32 1. Zapoznaj się z priority_queue::top. Dokładnie mówiąc- zobacz co zwraca. Następnie spójrz jakiego typu jest pomo.left . Widzisz już błąd? 2. pomo.left.ile - jakiego typu jest left ? |
|
Leniwy Temat założony przez niniejszego użytkownika |
» 2011-01-27 18:32:31 Faktycznie top zwraca const ... to mam na sztywno stworzyć 2 obiekty i przepisać do nich zawartość top'u, a następnie podkleić pod left i right? Left jest wskaźnikiem na obiekt typu Huff, ma być odnośnikiem do następnego elementu. |
|
malan |
» 2011-01-27 18:54:54 1. Faktycznie top zwraca const(...) |
Nie o to teraz chodzi... int * ptr = new int; std::priority_queue < int > mypq;
mypq.push( 10 ); mypq.push( 20 ); mypq.push( 15 );
ptr = mypq.top();
delete ptr;
error C2440: '=' : cannot convert from 'int' to 'int *'
int * ptr = new int; std::priority_queue < int > mypq;
mypq.push( 10 ); mypq.push( 20 ); mypq.push( 15 );
( * ptr ) = mypq.top();
delete ptr; ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
Widzisz już swój błąd? 2. Left jest wskaźnikiem(...) |
No właśnie, pomo.left jest wskaźnikiem, nic Ci to nie mówi? Oj, oj- radzę wrócić do lekcji o wskaźnikach ;) |
|
Leniwy Temat założony przez niniejszego użytkownika |
» 2011-01-27 19:11:10 Tak, ale nie do końca rozumiem :/ Przyznaje że wskaźniki to moja pięta achillesowa w C++ :/ próba: ( * pomo ).left = PQ.top(); tez kończy się niepowodzeniem, podobnie jak ( * pomo ) = PQ.top(); w obu przypadkach pomo deklaruje tak: Huff * pomo = new Huff; a błędy odpowiednio brzmią: cannot convert `const Huff' to `Huff*' in assignment lub no match for 'operator=' in '*pomo = (&PQ)->std::priority_queue<_Tp, _Sequence, _Compare>::top [with _Tp = Huff, _Sequence = std::vector<Huff, std::allocator<Huff> >, _Compare = std::less<Huff>]()' candidates are: Huff& Huff::operator=(Huff&) ------------------------------------------------------------------------------------------- Komponuje, komponuje i nie wychodzi :/ Jak to powinno być aby zaczęło działać? |
|
malan |
» 2011-01-27 21:01:53 No, praaawie dobrze ;p. 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 ); }; |
|
« 1 » 2 3 |