[C++] Stos kontra zmienne globalne.
Ostatnio zmodyfikowano 2018-02-01 07:18
SzymSzym Temat założony przez niniejszego użytkownika |
[C++] Stos kontra zmienne globalne. » 2018-01-30 15:46:00 Utworzyłem zmienną globalną licznik, służącą do zliczania wywołań funkcji rekurencyjnej. Wewnątrz funkcji następuje zrzucenie wartości licznika na stos intów, a następnie zmiana jego wartości (jako zmiennej globalnej, stosu nie ruszam) std::stack < int > liczniki;
liczniki.push( licznik ); licznik = 1;
Problem polega na tym, że po przypisaniu 1 do zmiennej licznik, funkcja liczniki.top() zwraca przypadkową wartość. Widać to w debuggerze, ale również w samym kodzie z zastosowaniem porównań, więc problem nie leży w debuggerze. Próbowałem też przypisywać wartość licznika do tymczasowej zmiennej i dopiero ją wrzucić na stos, jednakże daje to ten sam efekt. |
|
pekfos |
» 2018-01-30 16:18:19 Podaj więcej kodu. |
|
SzymSzym Temat założony przez niniejszego użytkownika |
» 2018-01-31 07:49:38 Kod się składa z 6 plików, po 150 linijek każdy więc nie wrzucę całego, ale powiedzmy że to są deklaracje globalne: int * wynik; typedef std::stack < int * > stosCombo; static stosCombo stos; stosCombo * currentStos = & stos; int licznik = 0;
A to jest funkcja, w której występuje błąd: int * wylicz( int biale, int czarne, int * poprzedniRuch ) { if( poprzedniRuch == NULL ) { wynik = new int[ iloscPol ]; for( int i = 0; i < iloscPol; i++ ) wynik[ i ] = niebieski; fillStos(); for( int i = 0; i < iloscPol; i++ ) wynik[ i ] = i; return wynik; } else { refreshStos( biale, czarne, poprzedniRuch ); int rozmiar = currentStos->size(); if( currentStos->empty() ) return NULL; licznik++; if( licznik == 1 ) { std::stack < int > liczniki; stosCombo wyniki; stosCombo kopiaStosu1 = stos; stosCombo kopiaStosu2 = stos; int * currentValue; while( !stos.empty() ) { kopiaStosu2 = stos; currentValue = kopiaStosu1.top(); currentStos = & kopiaStosu2; wylicz( 0, 0, currentValue ); int tmpLicznik = licznik; liczniki.push( tmpLicznik ); wyniki.push( currentValue ); licznik = 1; kopiaStosu1.pop(); rozmiar = stos.size(); int liczba = liczniki.top(); if( liczba == 4 ) int x; } int minimum = liczniki.top(); wynik = wyniki.top(); while( !liczniki.empty() ) { if( liczniki.top() < minimum ) { delete[] wynik; minimum = liczniki.top(); wynik = wyniki.top(); } else delete[] wyniki.top(); liczniki.pop(); wyniki.pop(); } return wynik; } else return wylicz( 0, 0, currentStos->top() ); } }
|
|
darko202 |
» 2018-01-31 11:10:49 >>Problem polega na tym, że po przypisaniu 1 do zmiennej licznik, funkcja liczniki.top() zwraca przypadkową wartość. Czy mógłbyś opisać dokładniej swój problem ? tzn. dokładnie w którym miejscu masz problem ja widzę std::stack < int > liczniki; / stos pusty ... int tmpLicznik = licznik; liczniki.push( tmpLicznik ); wyniki.push( currentValue ); licznik = 1; kopiaStosu1.pop();
rozmiar = stos.size(); int liczba = liczniki.top();
czyli robisz operację zdjęcia ostatniego elementu z pustego stosu na http://www.cplusplus.com/reference/stack/stack/top/Exception safety Provides the same level of guarantees as the operation performed on the container (no-throw guarantee for standard non-empty containers). https://support.microsoft.com/pl-pl/help/158040/how-to-use-the-stack-top-and-stack-empty-stl-functions-in-visual-cYou should ensure that there are one or more elements on the stack before calling the top function. czyli Przed wywołaniem funkcji top należy upewnić się, że na stosie znajduje się co najmniej jeden element. |
|
mateczek |
» 2018-02-01 07:18:06 |
|
« 1 » |