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

[C++] wskaźniki oraz stringi w funkcjach (kodowanie huffmana)

Ostatnio zmodyfikowano 2014-07-01 15:43
Autor Wiadomość
pekfos
» 2014-06-27 21:15:15
właśnie zauważyłam, że przy takim rozwiązaniu wyskakuje mi błąd, a nawet 3.
Podaj treść tych błędów. Najlepiej wraz z aktualnym kodem.
P-112863
kinga9650
Temat założony przez niniejszego użytkownika
» 2014-06-27 21:44:42
C/C++
#include <iostream>
#include <queue>
#include <string>

using namespace std;

class element
{
public:
    int key;
    char znak;
    element * left;
    element * right;
    element( char a, int k )
        : key( k )
         , znak( a )
         , left( NULL )
         , right( NULL )
    { };
    element() { };
   
   
    void kod( string pre )
    {
        if( this->znak != NULL ) cout << this->znak << " - " << pre << endl;
        else
        {
            this->right.kod( pre + "1" );
            this->left.kod( pre + "0" );
        }
    }
   
    void kod()
    {
        if( this->znak != NULL ) cout << this->znak << " - 1" << endl;
        else
        {
            this->right.kod( 1 );
            this->left.kod( 0 );
        }
    }
   
};

bool operator <( element po1, element po2 )
{
    if( po1.key < po2.key ) return true;
    else return false;
   
}


int main()
{
    int ileznakow;
    cin >> ileznakow;
   
    priority_queue < element > kolejka;
    char znak;
    int jakczesto;
    element el1, el2, el3;
    for( int i = 0; i < ileznakow; ++i )
    {
        cin >> znak >> jakczesto;
        el1 = element( znak, - jakczesto );
        kolejka.push( el1 );
    }
   
    while( kolejka.size() > 1 )
    {
        element * el1 = kolejka.top();
        kolejka.pop();
        element * el2 = kolejka.top();
        kolejka.pop();
        element * el3 = new element;
        el3->key = el1->key + el2->key;
        el3->znak = NULL;
        el3->left = el1;
        el3->right = el2;
        kolejka.push( el3 );
    }
   
    kolejka.top().kod();
   
    return 0;
}
|23|error: request for member 'kod' in '((element*)this)->element::right', which is of non-class type 'element*'|
|24|error: request for member 'kod' in '((element*)this)->element::left', which is of non-class type 'element*'|
|33|error: request for member 'kod' in '((element*)this)->element::right', which is of non-class type 'element*'|
|34|error: request for member 'kod' in '((element*)this)->element::left', which is of non-class type 'element*'|

|65|error: cannot convert 'const element' to 'element*' in initialization|
|67|error: cannot convert 'const element' to 'element*' in initialization|

|74|error: no matching function for call to 'std::priority_queue<element, std::vector<element, std::allocator<element> >, std::less<element> >::push(element*&)'|
|509|note: candidates are: void std::priority_queue<_Tp, _Sequence, _Compare>::push(const typename _Sequence::value_type&) [with _Tp = element, _Sequence = std::vector<element, std::allocator<element> >, _Compare = std::less<element>]|

|77|error: passing 'const element' as 'this' argument of 'void element::kod()' discards qualifiers|

||=== Build finished: 8 errors, 2 warnings (0 minutes, 0 seconds) ===|
P-112866
michal11
» 2014-06-27 22:23:06
right i left są wskaźnikami więc jeżeli chcesz wywołać orzez nie jakąś funkcję to musisz to zrobić przez
->
 a nie
.
P-112868
kinga9650
Temat założony przez niniejszego użytkownika
» 2014-06-27 22:34:53
Ok, w takim razie zostały mi już tylko problemy poniżej 64 linijki ;)
P-112869
michal11
» 2014-06-27 23:38:55
Aż dziwne, że tak mało błędów ci się wyświetliło. ten kod jest fatalny.

C/C++
element el1, el2, el3;

//...

element * el1 = kolejka.top();
kolejka.pop();
element * el2 = kolejka.top();
kolejka.pop();
element * el3 = new element;

Najpierw tworzysz el1, el2, el3 jako elementy a później tworzysz wskaźniki tak samo nazwane i to w dodatku w pętli i tym wskaźnikom przypisujesz nie adres tylko obiekt. To jest bez sensu.

el1 = element( znak, - jakczesto );

Tu z kolei chyba próbujesz wywołać jawnie konstruktor, ciągle z tymi samymi argumentami, które nawiasem mówiąc są niezainicjalizowane więc siedzą tam śmieci, w dodatku w pętli. Wykonujesz ileś razy tą sama rzecz i to jeszcze nieprawidłowo.

kolejka.push( el3 );

Tutaj przesyłasz wskaźnik do funkcji która oczekuje referencji.

W funkcji kod porównujesz znak z NULL, nie jestem pewien ale to też jest chyba błąd, bo z NULL można porównywać tylko wskaźniki.
P-112870
kinga9650
Temat założony przez niniejszego użytkownika
» 2014-06-28 23:35:33
Pogubiłam się.. czyli jak wywołam konstruktor to nie powstaje mi nowy element, a tylko nadpisuję podane zmienne do utworzonego już elementu?
Bo w oparcie o przeciwne założenie udało mi się zmiejszyć ilość błędów, ale nie wiem czy w związku z tym cały program nie będzie tak właściwie robił... nic

A w tego co mi wiadomo można porównywać znaki z NULL, choć kompilatory pokazują warning, ale podobno działa jak należy :)
P-112902
michal11
» 2014-06-30 14:11:34
Nie, jeżeli wywołasz konstruktor to tworzysz nowy obiekt. Dodatkowo u ciebie nie ma ani konstruktora kopiującego ani operatora= więc ta linijka
el1 = element( znak, - jakczesto );
 nie działa tak jak myślisz, że działa.
P-112976
pekfos
» 2014-06-30 14:58:00
Dodatkowo u ciebie nie ma ani konstruktora kopiującego ani operatora= więc ta linijka
el1 = element( znak, - jakczesto );
 nie działa tak jak myślisz, że działa.
Tak? Możesz rozwinąć, co zamiast czego się dzieje?
P-112980
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona