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

Zgłoszono nieobsługiwany wyjątek: naruszenie dostępu do zapisu.

Ostatnio zmodyfikowano 2020-04-01 17:27
Autor Wiadomość
Gromorth
Temat założony przez niniejszego użytkownika
Zgłoszono nieobsługiwany wyjątek: naruszenie dostępu do zapisu.
» 2020-04-01 16:55:33
Pisze program tworzacy dwa stosy, do pierwszego sam wpisuje z klawiatury 10 liczb, a drugi ma mi je wypisac, a po tej akcji mieć zawartosc taką samą jak przed wypisaniem. Problem tworzy sie przy funkcji push, choc to pewnie problem z czyms innym oto moj kod:
 
C/C++
#include <iostream>
#include <cstdlib>
#include <cstdio>

using namespace std;


class stos
{
public:
   
    int size;
    int teraz;
    int * element;
   
   
    void init( stos & Stos, int a )
    {
        Stos.size = a;
        Stos.element = new int[ a ];
    }
   
    void destroy( stos & Stos )
    {
        delete[] Stos.element;
    }
   
    void push( stos & Stos, int b )
    {
        if( Stos.teraz < Stos.size )
        {
            Stos.element[ Stos.teraz ] = b;
            Stos.teraz = Stos.teraz + 1;
        }
        else
        {
            cout << "Stos pelny";
        }
    }
   
    void pop( stos & Stos )
    {
        if( Stos.teraz > 0 )
        {
            Stos.teraz = Stos.teraz - 1;
        }
        else
             cout << "Stos pusty";
       
    }
    int top( stos & Stos )
    {
        if( Stos.teraz > 0 )
        {
            cout << Stos.element[ Stos.teraz - 1 ] << endl;
            return Stos.element[ Stos.teraz - 1 ];
        }
        else
             cout << "Stos pelny";
       
    }
   
    bool empty( stos & Stos )
    {
        if( Stos.teraz != 0 )
        {
            cout << "Stos nie pusty";
            return true;
        }
        else
        {
            cout << "Stos pusty";
            return false;
        }
       
    }
   
    bool full( stos & Stos )
    {
        if( Stos.teraz == Stos.size )
        {
            cout << "Stos pelny";
            return true;
        }
        else
        {
            cout << "Stos nie pelny";
            return false;
        }
       
    }
   
   
};


int main()
{
   
    stos jeden;
    stos dwa;
   
    jeden.init( jeden, 10 );
    dwa.init( dwa, 10 );
   
    int los;
   
    for( int i = 0; i < 10; i++ )
    {
        cout << endl << "Podaj " << i + 1 << " liczbe:";
        cin >> los;
        jeden.push( jeden, los );
    }
   
    for( int i = 0; i < 10; i++ )
    {
        dwa.push( dwa, jeden.top( jeden ) );
        jeden.pop( jeden );
       
    }
   
   
    return 0;
}
P-176589
pekfos
» 2020-04-01 17:01:10
Składowa teraz nie jest zainicjalizowana.

C/C++
jeden.init( jeden, 10 );
Po co ten pierwszy argument we wszystkich metodach? Bieżący obiekt jest przekazany do niestatycznych metod z definicji. To powinno być jeden.init(10).
P-176590
Gromorth
Temat założony przez niniejszego użytkownika
nie do końca rozumiem
» 2020-04-01 17:11:42
czyli jak mam ta zmienna zainicjalizowac, bo to chyba nie jest to aby zrobic ją const i czy zmiana tych jeden.init(jeden,10) jest konieczna?
P-176591
pekfos
» 2020-04-01 17:21:02
czyli jak mam ta zmienna zainicjalizowac, bo to chyba nie jest to aby zrobic ją const
Nadaj jej wartość początkową. Zero ma tu sens, w init().

czy zmiana tych jeden.init(jeden,10) jest konieczna?
Nie.. Tak samo jak pisanie poprawnego kodu nie jest konieczne. Ten argument to bezużyteczna redundancja. Więcej pisania i sposób na popełnienie trudnego do znalezienia błędu. Gdyby kod był dłuższy, a błąd nie był oczywisty, każdy normalny programista powiedziałby, żebyś wrócił gdy powywalasz te głupie argumenty. Inaczej trzeba by wszędzie sprawdzać, czy nie strzeliłeś się nimi w stopę.
P-176593
Gromorth
Temat założony przez niniejszego użytkownika
Zamykam
» 2020-04-01 17:27:20
Dzięki wielkie, nastepnym razem postaram się pisać bez strzelania sobie w stope :D
P-176594
« 1 »
  Strona 1 z 1