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

[C++] Stos kontra zmienne globalne.

Ostatnio zmodyfikowano 2018-02-01 07:18
Autor Wiadomość
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)
C/C++
std::stack < int > liczniki;
//...
liczniki.push( licznik ); //wrzucenie zmiennej globalnej na stos
licznik = 1; //zmiana wartości zmiennej globalnej
//...

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.
P-169137
pekfos
» 2018-01-30 16:18:19
Podaj więcej kodu.
P-169138
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:
C/C++
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:
C/C++
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() );
       
    }
}
P-169142
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ę

C/C++
std::stack < int > liczniki; / stos pusty
...// nic nie robimy z liczniki
int tmpLicznik = licznik; //inicjalizacja zmienną licznik
liczniki.push( tmpLicznik ); //włożenie na stos
wyniki.push( currentValue );
licznik = 1; // zmiana wartości zmiennej licznik
kopiaStosu1.pop(); // zdjęcie ze stosu ostatnio dodanego elementu czyli(tmpLicznik)

rozmiar = stos.size();
int liczba = liczniki.top(); // top - zwraca wartość szczytowego elementu na stosie.
// ? a stos pusty

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-c
You 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.
P-169143
mateczek
» 2018-02-01 07:18:06
P-169165
« 1 »
  Strona 1 z 1