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
Pzepisanie elemntu kolejki do obiektu.
» 2011-01-27 17:09:23
Witam,

C/C++
#include <cstdlib>
#include <iostream>
#include <string>
#include <queue>

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;
       
    }
   
    Huff & operator =( Huff & y ) {
        this->co = y.co;
        this->ile = y.ile;
        this->left = y.left;
        this->right = y.right;
        return * this;
    }
   
};


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++ ) {
        if( ASCII[ i ] != 0 ) PQ.push( Huff( ASCII[ i ],( char ) i ) );
       
    };
   
    // ----- * 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 );
    };
    system( "PAUSE" );
    return EXIT_SUCCESS;
} // main


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:
C/C++
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]
P-27231
McAffey
» 2011-01-27 17:57:37
Wstaw kod w tagi cpp ( (cpp)...(/cpp) tylko nawiasy kwadratowe), będzie czytelniej.
P-27237
Leniwy
Temat założony przez niniejszego użytkownika
» 2011-01-27 18:16:37
I jak? jest ktoś w tanie mi pomóc?
P-27239
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
?
P-27240
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.
P-27243
malan
» 2011-01-27 18:54:54
1.
Faktycznie top zwraca const(...)
Nie o to teraz chodzi...
C/C++
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 *'

C/C++
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 ;)
P-27246
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ć?
P-27247
malan
» 2011-01-27 21:01:53
No, praaawie dobrze ;p.
C/C++
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 );
};
P-27252
« 1 » 2 3
  Strona 1 z 3 Następna strona