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. |
|
kinga9650 Temat założony przez niniejszego użytkownika |
» 2014-06-27 21:44:42 #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) ===| |
|
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 . |
|
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 ;) |
|
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. 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. |
|
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 :)
|
|
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. |
|
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? |
|
1 « 2 » 3 |