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

Nie mogę zmienić wartości zmiennej.

Ostatnio zmodyfikowano 2017-07-23 22:24
Autor Wiadomość
0x07
Temat założony przez niniejszego użytkownika
Nie mogę zmienić wartości zmiennej.
» 2017-07-23 19:14:00
Cześć Wam drodzy użytkownicy.

Uczę się programować w języku C++ z książki. W trakcie wykonywania jednego z ćwiczeń natrafiłem na przeszkodę, której natury w żaden sposób nie mogę pojąć. Co najgorsze nie jest ona nawet związana z tematem zadania (zarządzanie pamięcią dynamiczną za pomocą konstruktorów i destruktorów klas). W moim kodzie zmienna "unsigned long nazwa_zmiennej" jest zawsze reprezentowana tą samą wartością (3452816845), nawet jeżeli zostanie zainicjalizowana odmienną liczbą (np. uns long nazwa = 900;). Kod:

C/C++
using namespace std;
Stack st;
char ch;
unsigned long po = 909;
cout << "Nacisnij D, aby wprowadzic deklaracje, \n"
<< "P, aby przetworzyc deklaracje, lub K, aby zakonczyc.\n";
while( cin >> ch && toupper( ch ) != 'K' )
{
    while( cin.get() != '\n' )
         continue;
   
    if( !isalpha( ch ) )
    {
        cout << '\a';
        continue;
    }
    switch( ch )
    {
    case 'D':
    case 'd': cout << "Podaj numer nowej deklaracji: ";
        cin >> po;
        if( st.isfull() )
             cout << "Stos pelen!\n";
        else
        {
            st.push( po );
        }
        break;
    case 'P':
    case 'p': if( st.isempty() )
             cout << "Stos pusty!\n";
        else
        {
            st.pop( po );
            cout << "Deklaracja nr " << po << " zdjeta\n";
        }
        break;
    }
    cout << "Nacisnij D, aby wprowadzic deklaracje, \n"
    << "P, aby przetworzyc deklaracje, lub K, aby zakonczyc.\n";
}
pozwala dodawać i odejmować elementy ciągu wskazywanego przez wskaźnik będący prywatną składową klasy. Problem w tym, ze pierwszy dodany element zwalniany instrukcją switch(ch == p) zawsze otrzyma wartość 3452816845 w strumieniu wyjścia. Każdy kolejny wyświetli się zgodnie z przypisaną wartością. Implementacja metod klasy jest w porządku, już to sprawdziłem. Debugger pokazuje, że wartość "unsigned long po" ma zawsze wartość 3452816845 przed dodaniem pierwszego elementu, nawet jeśli został zainicjalizowany inną wartością. Będę wdzięczny za każdą pomoc.

Pozdrawiam serdecznie
0x07
P-163513
Kinexity
» 2017-07-23 19:34:14
Nie znam przyczyny twojego problemu, ale 3452816845 jest równe 0xCDCDCDCD, co nie wydaje się przypadkowe.
P-163514
pekfos
» 2017-07-23 21:34:58
Podaj cały kod.
P-163516
0x07
Temat założony przez niniejszego użytkownika
» 2017-07-23 22:01:35
C/C++
#ifndef STACK0_H_
#define STACK0_H_
#include <iostream>
typedef unsigned long Item;

class Stack
{
private:
    enum { MAX = 10 };
    Item * pitem;
    int size;
    int top;
public:
    explicit Stack( int n = MAX );
    Stack( const Stack & st );
    ~Stack();
    bool isempty() const;
    bool isfull() const;
    bool push( const Item & item );
    bool pop( Item & item );
    Stack & operator =( const Stack & st );
    friend std::ostream & operator <<( std::ostream & os, const Stack & st );
};


#endif // !STACK0_H_
#pragma once
C/C++
#include "stack0.h"

Stack::Stack( int n )
{
    if( n < 0 )
    {
        std::cout << "Wartosc argumentu nie moze byc ujemna.\n"
        << "Ustawiam wartosc n na 10.\n";
        n = MAX;
    }
    pitem = new Item[ MAX ];
    size = top = 0;
}

Stack::Stack( const Stack & st )
{
    size = st.size;
    top = st.top;
    pitem = new Item[ MAX ];
    for( int i = 0; i < size; i++ )
         pitem[ i ] =( st.pitem )[ i ];
   
}

Stack::~Stack()
{
    delete[] pitem;
}

bool Stack::isempty() const
{
    return top == 0;
}

bool Stack::isfull() const
{
    return top == MAX;
}

bool Stack::push( const Item & item )
{
    if( isfull() )
    {
        return false;
    }
    else
    {
        pitem[ top++ ] = item;
        size++;
        return true;
    }
}

bool Stack::pop( Item & item )
{
    if( isempty() )
    {
        return false;
    }
    else
    {
        item = pitem[ top-- ];
        size--;
        return true;
    }
}

Stack & Stack::operator =( const Stack & st )

{
    if( this == & st )
         return * this;
   
    delete[] pitem;
    size = st.size;
    top = st.top;
    pitem = new Item[ MAX ];
    for( int i = 0; i < size; i++ )
         pitem[ i ] =( st.pitem )[ i ];
   
    return * this;
}

std::ostream & operator <<( std::ostream & os, const Stack & st )
{
    for( int i = 0; i < st.size; i++ )
         std::cout << ": " <<( st.pitem )[ st.size ] << " - obiekt nr " << i + 1;
   
    return os;
}

Jak rozumiem problem tkwi w niepoprawnym zarządzaniu pamięcią dynamiczną. Bardzo bym prosił o wyjaśnienie co robię nie tak, aby w przyszłości nie popełniać podobnych błędów.[/i][/i][/i]
P-163517
pekfos
» 2017-07-23 22:16:07
C/C++
item = pitem[ top-- ];
C/C++
item = pitem[ --top ];
P-163518
0x07
Temat założony przez niniejszego użytkownika
» 2017-07-23 22:24:56
Heh, co ekspert to ekspert. Dziękuję.
P-163519
« 1 »
  Strona 1 z 1