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

c++ lista, funkcja usuwajaca elementy i wypelnaijaca liste / wskaznik na wskaznik

Ostatnio zmodyfikowano 2014-08-07 20:48
Autor Wiadomość
tookie009
Temat założony przez niniejszego użytkownika
c++ lista, funkcja usuwajaca elementy i wypelnaijaca liste / wskaznik na wskaznik
» 2014-08-07 17:07:20
czesc, mam stronke, na ktorej moge sobie dodawac odbiorcow pewnej wiadomosci. Nogdy nie wiem ile tych odbiorcow bedzie. W skripcie php zapisuje potem te dane do pliku xml. Nastepnie potrzebuje je sparsowac w c++. Do tego celu chcialem uzyc zatem listy. Chcialem takze zrobic funkcja, ktora bedzie mi w jednym obrocie kasowala cala liste i wypelniala ja. Chce, zeby obeszlo sie bez std::owskiej list.
niestety, program ma juz 2. tysiace linijek, dlatego tylko najwazniejsze:


C/C++
//struktura
struct notfs {
    char number[ 50 ];
    char way[ 3 ];
    notfs * next;
};

//w main
notfs * empfaenger = NULL, * first_emp = empfaenger;
XsetNotification( root, & empfaenger, & first_emp );


notfs * XsetNotification( xmlNode * root, notfs ** all, notfs ** first ) // tu musze przez wskaznik na wskaznik, inaczej nie zmienia sie w main wartosc empfaenger
{
   
   
    xmlNode * node, * node2;
    node = XMLgetNode( root, "notifications" );
    if( !node )
    { printf( "Falsche Konfigurationsdatei\n" ); return NULL; }
    node2 = XMLgetNode( node, "adressat" );
   
    notfs * tmp;
    cout << "HOERRR" <<* all << endl;
    // tutaj oprozniam liste, jezeli cos w niej jest
    while( * all != NULL )
    {
        cout << "NOT NULL" << endl;
        cout << "NUMMER" <<( * all )->number << endl;
        tmp =* all;
        * all =( * all )->next;
        delete * all;
    }
   
   
    xmlChar * val;
    // tu czytam sobie plik xml.
    ( * first ) = NULL;
    while( node2 != NULL )
    {
        ( * all ) = new notfs;
        cout << "s " <<( * all ) << endl;
        // w debugerze widze, ze w szystko idzie zgodnie z planem
        if(( * first ) == NULL )
        // zapamietuje 1. element.
            ( * first ) =( * all );
       
        val = xmlGetProp( node2,( const xmlChar * ) "nummer" );
       
        memset(( * all )->number, 0, 50 );
        strcpy(( * all )->number,( const char * ) val );
        val = xmlGetProp( node2,( const xmlChar * ) "verfahren" );
        memset(( * all )->way, 0, 3 );
        strcpy(( * all )->way,( const char * ) val );
        node2 = node2->next;
        ( * all ) =( * all )->next;
       
    }
    ( * all ) = NULL;
    cout << "in der Funktion" << endl;
    cout <<( * first ) << endl; // dobry adres ( jak przy 1. obrocie petli while
    cout <<( * first )->next << endl; // zly adres, nie zostal zmieniony 
   
    cout << "dancha" << endl;
    return NULL; // wstepnie byla to funkja void, ale nie chodzilo i probowalem juz wiecej mozliwosci. To, zeby kompilator nie marudzil
}
P-115176
michal11
» 2014-08-07 20:10:39
Ale jaki masz konkretnie problem ?
P-115183
tookie009
Temat założony przez niniejszego użytkownika
» 2014-08-07 20:48:45
wykonuje ta funkcje, zeby wypelnic liste empfaenger. Na poczatku funkcji kasuje ta liste. Potem pod first chce zapisac adres nowo utworzonego obiektu - Pierwszego w  tej liscie. Nastepnie przesuwam all, az nie bedzie czym to wypelniac. Po tym mialem nadzieje, ze pod first_emp bede mial pierwszy element, ktory zostal wypelniony w petli while w funckji. Tak tez jest. Ale pod first_emp->next nie ma nastepnego elementu, tylko 0xffffff czyli po prostu falszywy adres. Nie moge zrozumiec dlaczego. Przeciez w funckji napierw zapisuje adres pierwszego all pod tym first_emp a dopiero potem przesuwam all. Wiec powinienem miec pod first->emp nastepny element (all->next). 

Petla while wykonuje sie 3 razy. 3 elementy beda wczytane w ta liste na pewno.
P-115191
« 1 »
  Strona 1 z 1