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

Nie moge przypisać danych do elementu "first" w liscie

Ostatnio zmodyfikowano 2014-05-21 23:59
Autor Wiadomość
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 Element
C/C++
Element::Element( Pakiet * _msg )
{
    next = NULL;
    //prev=NULL;
}

Klasa Queue
C/C++
Queue::Queue()
    : first( NULL )
     , last( NULL )
     , curr_queue( 0 )
{ };

//---------------------------------------------
bool Queue::push( Pakiet * _msg )
{
    if( !first )
    {
        first = new Element( _msg ); // TUTAJ POJAWIA SIE TEN BLAD GDYZ DANE Z _MSG NIE SA KOPIOWANE DO ELEMENTU FIRST !!!!!!!!!!!!!!!!
        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; //Tu pojawia sie wyjatek gdy chce      sprawdzić dane...
       
        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 Pakiet
C/C++
private:

int msg_type; //!< type of msg
int msg_size; //!< size of message
int ID_source; //!< number ID of source device
int ID_dest; //!< number ID of destination device
P-110595
Moorfox
» 2014-05-21 23:06:47
C/C++
Element::Element( Pakiet * _msg )
{
    next = NULL;
    //prev=NULL;
}

Niby wywolujesz funkcje dla argumentu _msg ale gdzie zapisujesz te dane
C/C++
class Element {
    Pakiet * pak;
    Element * next;
}
Element::Element( Pakiet * _msg )
{
    pak = _msg
    next = NULL;
    //prev=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.
P-110611
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.
P-110617
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
C/C++
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
C/C++
int main()
{
   
    Kolejka b;
    if( 1 )
    {
        Element a;
        b.push( & a );
    } //Tutaj pamiec po obiekcie a jest zwalniana wiec first->pak teraz wskazuje na pamiec ktora nie zawiera danych i jest to //takze proba odwolania sie do nie przydzielonej pamieci co wyrzuci wyjatek
}

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
P-110620
« 1 »
  Strona 1 z 1