Nie moge przypisać danych do elementu "first" w liscie
Ostatnio zmodyfikowano 2014-05-21 23:59
tirou Temat założony przez niniejszego użytkownika |
Nie moge przypisać danych do elementu "first" w liscie » 2014-05-21 21:01:23 Witam, potrzebuje pomocy, gdyż nie potrafię rozwiązać pewnego problemu: Otóż, posiadam listę danych , na której stworzyłem standardowe funkcje: Push, Pop itd. Klasa element to obiekty które beda znajdowały się na liscie. Obiekty tej klasy pobierają wskaźnik na obiekt klasy Pakiet który ma w sobie wiele zmiennych takich jak: ID, rozmiar itp. Problem pojawia się w momencie, gdy chce wstawić na początkowo pustą listę element i przypisać go do wskaźnika: first niestety, wskaźnik ten nie zachowuje w sobie żadnych danych i nie można się potem do nich odwołać. Czy miałby ktoś ochotę pomoc? Klasa ElementElement::Element( Pakiet * _msg ) { next = NULL; }
Klasa Queue Queue::Queue() : first( NULL ) , last( NULL ) , curr_queue( 0 ) { };
bool Queue::push( Pakiet * _msg ) { if( !first ) { first = new Element( _msg ); last = first; cout << "\nPUSH: stan firsta: \nnumer wygenerowanego pakietu: " << first->_msg->get_msg_ID() << endl; cout << "\nPUSH: stan firsta: \nzrodlo wygenerowanego pakietu: " << _msg->get_source() << endl; cout << "\nPUSH: stan firsta: \nprzeznaczenie wygenerowanego pakietu: " << first->_msg->get_dest() << endl; curr_queue += _msg->get_size(); cout << "PUSH: dl kolejki " << this->queue_ID << " to " << curr_queue << endl; _msg->curr_buffer = this->queue_ID; return true; } if(( curr_queue + _msg->get_size() ) <= max_queue ) { last = last->next = new Element( _msg ); curr_queue += _msg->get_size(); _msg->curr_buffer = this->queue_ID; cout << "dodalem niepierwszy element" << endl; return true; } cout << "\nnie udalo sie wepchnac pakietu do kolejki\n"; return false; }
Dodam rowniez dane z Klasa Pakietprivate:
int msg_type; int msg_size; int ID_source; int ID_dest;
|
|
Moorfox |
» 2014-05-21 23:06:47 Element::Element( Pakiet * _msg ) { next = NULL; }
Niby wywolujesz funkcje dla argumentu _msg ale gdzie zapisujesz te dane class Element { Pakiet * pak; Element * next; } Element::Element( Pakiet * _msg ) { pak = _msg next = NULL; }
Po za tym jest jeszcze blad poniewaz jezeli stworzysz obiekt statycznie i jesli skonczy sie "jego termin waznosci" zostanie on usuniety i cala kolejka zrojnowana. Powinienes raczej zapisywac odpowiednie informacje w konstruktorze czyli tutaj nie Pakiet* pak tylko Pakiet pak i na przyklad pak.wartosc = _msg->wartosc ewentualnie (co lepsze) podawac je w argumencie konstruktora kolejki oraz elementu. |
|
tirou Temat założony przez niniejszego użytkownika |
» 2014-05-21 23:43:56 Dziekuje kolego za zainteresowanie i odpowiedź.
Implementuje symulacje , a ten (Pakiet * _msg) tak naprawdę to on jest w tej mojej kolejce "na chwile", ponieważ zaraz go wkladam w inna kolejkę a z tamtej usuwam, więc raczej mi nie grozi "utrata ważności" jeżeli o to ci naprawdę chodziło.
Pozdrawiam. |
|
Moorfox |
» 2014-05-21 23:59:23 Chodzi mi o to ze masz jakis obiekt typu Element, on zajmuje pewna przestrzen w pamieci jesli utraci on zakres waznosci, a wskaznik w obiekcie element z kolejki ktory alokujesz dynamicznie wskazuje na ten obiekt czyli naprzyklad Element a; Kolejka b; b.push( & a );
Oznacza to ze first->pak = &a <-- co oznacza ze pak wskazuje na adres elementu a jezeli obiekt a zostanie usuniety na przyklad int main() { Kolejka b; if( 1 ) { Element a; b.push( & a ); } }
Jest to podstawowa roznica miedzy danymi alokowanymi dynamicznie a statycznie poniewaz dynamicznie konczy sie w dwóch wypadkach: - kiedy uzyjemy funkcji delete lub jego odpowiednika z c free jesli dobrze pamietam xd - po zakonczeniu programu - jednak nie zawsze na starszych windowsach to zjawisko nie wystepowalo tylko od pewnego czasu tak jest na nie ktorych systemach operacyjnych to zjawisko nadal nie wystepuje trzeba pamietac o zwolnieniu pamieci inaczej bedzie memory leak. Jednak zmiennych dynamicznych nie uzywa sie do tworzenia obiektow ktora maja byc przeslane, to struktura danych ma zapewnic dynamiczna alokacje pamieci tak jak ty to zrobiles first = new Element(_msg) Ty masz dac po prostu informacje czyli najlepiej Kolejka b; b.push(dana,dana, dana); Jeszcze jedno kolejka to dynamiczna struktura danych co oznacza wlasnie ze sama alokuje pamiec nie mozesz jej przypisac obiektu statycznego. Jedynie mozesz skopiowac informacje z obiektu statycznego czyli wlasnie dla _msg bedzie to pak.wartosc = _msg->wartosc. Lecz metoda z wpisywaniem danych w konstruktorze jest bardziej elegancka. Ciezko to wyjasnic sporo teorii w tym ;x |
|
« 1 » |