Drzewo binarne - access violation reading location

0

Piszę program, którego zadaniem jest obliczanie wyrażeń wpisywanych w ONP. Mam problem przy przechodzeniu przez drzewo binarne. Otrzymuję komunikat o treści:

Unhandled exception at 0x012A3006 in KalkulatorAll.exe: 0xC0000005: Access violation reading location 0xCDCDCDED.

Komunikat z call stacka:

KalkulatorAll.exe!Wezel::pobierzLewy() Line 104
KalkulatorAll.exe!Drzewo::inOrder(Wezel *w, int mode) Line 95
KalkulatorAll.exe!Drzewo::inOrder(Wezel *w, int mode) Line 100
KalkulatorAll.exe!Kalkulator::pokazInfiks() Line 19
KalkulatorAll.exe!main() Line 20

Metoda pobierzLewy() wygląda następująco:

Wezel *Wezel::pobierzLewy()
{
    return lewy; //Line 104
}

inOrder():

void Drzewo::inOrder(Wezel *w, int mod)           
{                                                
    int rodzaj;
    if(w != NULL){
    if (w->pobierzLewy() != NULL)// Line 95
        inOrder(w->pobierzLewy(),mod);
    }
    switch (rodzaj = w->pobierzRodzaj())// Line 100
    {
    case ST:                        
        if (mod==1)                
        cout << w->pobierzWartosc() << " ";
        break;
    case ZM:                        
        if (mod==1)                
            cout << w->pobierzNazwa() << " ";
        else                        
        {
            if (zmienne->czyZdef(w->pobierzNazwa()))    
            {
                w->podajRodzaj(ST);        
                w->podajWartosc(zmienne->pobierz(w->pobierzNazwa()));    
                w->podajNazwa(0);
            }
        }
        break;
    case OP:                    
        if (mod==1)            
        cout << w->pobierzOperator()<< " ";
        break;
    }
    if (w->pobierzPrawy() != 0)    
        inOrder(w->pobierzPrawy(),mod);
}

pokazInfiks():

void Kalkulator::pokazInfiks()
{
    drzewo.inOrder(drzewo.pobierzKorzen(),1);
}

I sama metoda main():

int main()
{
    Kalkulator kalkulator;
    string rownanie;
    cout << "Podaj rownanie: ";    
    getline(cin, rownanie, '\n');
    kalkulator.wprowadz(rownanie);
    kalkulator.pokazInfiks();
        // ...
}

Z góry dziękuję za wszelką pomoc.

0

Na oko wskaźnik "w" w linii 95 jest rypnięty i nie jest może NULLem ale nie pokazuje też na żaden poprawny obiekt. Tyle wynika ze stacktrace bo niestety kodu podałeś za mało (albo nie to co trzeba)

0

http://4programmers.net/Pastebin/2580 - pełen kod, tyle tylko, że długi... (i z angielską wersją nazw zmiennych)
Zabawa z breakpointami podsunęła mi, że być może jest coś skopane we wprowadzaniu wyrażenia (equationInput(string eq)) albo samej budowie drzewa z tego wyrażenia (createTree()), ale nie potrafię znaleźć, co dokładnie...
Z góry dzięki za wszelką pomoc

1 użytkowników online, w tym zalogowanych: 0, gości: 1