• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Program wysypuje się przy realokacji pamięci

Object Storage Arubacloud
0 głosów
116 wizyt
pytanie zadane 22 maja 2020 w C i C++ przez czarnywilczek Nowicjusz (120 p.)

Dzień dobry.

Mam mały problem z dynamiczną alokacją pamięci dla tablicy wskaźników na obiekty mojej klasy. Gdy tylko próbuję jej dokonać, program się zacina i odmawia dalszej współpracy. Jego zadaniem jest utworzenie szablonu klasy działającej jak stos.

Początkowy rozmiar tablicy to 1. Próba zalokowania pamięci już przy dwóch elementach kończy się klapą. Po zmianie początkowej wartości na 100 i ponownym uruchomieniu program bez problemu zmniejsza tablicę do rozmiaru dwóch elementów, ale już przy próbie zwiększenia jej do 3 wszystko znowu się psuje.

Będę bardzo wdzięczny za wszelkie wskazówki, które pomogą mi zażegnać ten problem.

static void write(T a)
    {
        klasa *bufor[ilosc];
        if (ilosc!=0)
        {
            for (int i=0;i<ilosc;i++) bufor[i]=stack[i];
            ilosc++;
            cout<<" "<<ilosc<<endl;
            stack=new klasa*[ilosc];
            if (stack==NULL) cout<<" Alokacja zakonczona niepowodzeniem"<<endl;
            cout<<" abc"<<endl;
            for (int i=0;i<ilosc-1;i++)
            {
                stack[i]=bufor[i];
            }
            cout<<" Zrealokowano pamiec"<<endl;
        }
        else
        {
            cout<<" Tablica nie wymaga realokacji"<<endl;
            ilosc++;
        }
        stack[ilosc-1]->value=a;
        stack[ilosc-1]->index=ilosc-1;
        cout<<" Zapisano obiekt!"<<endl;
    }

 

komentarz 22 maja 2020 przez tkz Nałogowiec (42,000 p.)
Używasz szablonów? stack==NULL to jest bezsensu, bo new nie zwraca nulla, tylko wyjątek "w razie w". Gdzie jest wielkość zmiennej "ilosc"? ilosć ma być też większa od 0, nie tylko różna. Musisz podać więcej kodu. Dlaczego nie użyjesz memmove?
komentarz 22 maja 2020 przez czarnywilczek Nowicjusz (120 p.)

1. Tak.

2. stack==NULL dodałem w akcie desperacji, gdy inne rozwiązania nie przyniosły pożądanego skutku.

3. Ilość to zmienna statyczna tej klasy. Wartość początkowa to 0, przy 1 realokacja tablicy jest zbędna (bo początkowy rozmiar tablicy to 1), a przy 2 realokacja powoduje przedwczesne zakończenie programu.

4. Nie znałem funkcji memmove. Muszę o niej poczytać.

5. Wrzucam cały kod:

//header
#ifndef ZAD11_H
#define ZAD11_H
#include <iostream>
using namespace std;

template <typename T> class klasa
{
public:
    static int ilosc;
    static klasa **stack;
    int index;
    T value;
    klasa(T a)
    {
        klasa *bufor[ilosc];
        if (ilosc!=0)
        {
            for (int i=0;i<ilosc;i++) bufor[i]=stack[i];
            cout<<" Proba zrealokowania pamieci..."<<endl;
            ilosc++;
            cout<<" Zwiekszono ilosc na..."<<ilosc<<endl;
            cout<<" "<<ilosc<<endl;
            stack=(klasa**)new klasa*[ilosc];
            for (int i=0;i<ilosc-1;i++)
            {
                stack[i]=bufor[i];
            }
            cout<<" Zrealokowano pamiec"<<endl;
        }
        else ilosc++;
        stack[ilosc-1]=this;
        this->index=ilosc-1;
        this->value=a;
        cout<<" Udalo sie dodac nowy obiekt!"<<endl;
    }
    ~klasa()
    {
        int a=this->index;
        for (int i=a;i<ilosc-1;i++)
        {
            stack[i]=stack[i+1];
            stack[i]->index--;
        }
        ilosc--;
        stack=new klasa*[ilosc];
        cout<<" Skasowano obiekt!"<<endl;
    }
    static void write(T a)
    {
        klasa *bufor[ilosc];
        if (ilosc!=0)
        {
            for (int i=0;i<ilosc;i++) bufor[i]=stack[i];
            ilosc++;
            cout<<" "<<ilosc<<endl;
            stack=new klasa*[ilosc];
            if (stack==NULL) cout<<" Dupa zbita!"<<endl;
            cout<<" abc"<<endl;
            for (int i=0;i<ilosc-1;i++)
            {
                stack[i]=bufor[i];
            }
            cout<<" Zrealokowano pamiec"<<endl;
        }
        else
        {
            cout<<" Tablica nie wymaga realokacji"<<endl;
            ilosc++;
        }
        stack[ilosc-1]->value=a;
        stack[ilosc-1]->index=ilosc-1;
        cout<<" Zapisano obiekt!"<<endl;
    }
    static void read()
    {
        if (ilosc==0)
        {
            cout<<" Stos jest pusty!"<<endl;
        }
        else if (ilosc==1)
        {
            cout<<stack[ilosc-1]->value<<endl;
            stack[ilosc-1]->value=0;
            ilosc--;
        }
        else
        {
            cout<<stack[ilosc-1]->value<<endl;
            ilosc--;
            stack=new klasa*[ilosc];
        }
        cout<<" Odczytano obiekt!"<<endl;
    }
    static void clear()
    {
        while (ilosc!=0)
        {
            read();
        }
        cout<<" Oczyszczono stos!"<<endl;
    }
    static bool empty()
    {
        if (ilosc==0) return 1;
        else return 0;
    }
    static int capacity()
    {
        cout<<" Sprawdzam ilosc elementow..."<<endl;
        return ilosc;
    }
    static void copy(T a[])
    {
        int b=length(a);
        cout<<b<<endl;
        for (int i=b;i>=0;i--) write(a[i]);
        cout<<" Skopiowano (chyba) pomyslnie!"<<endl;
    }
};
#endif // ZAD11_H

//main
#include <zad11.h>

typedef klasa<int> klasaint;
typedef klasa<double> klasadouble;
template<>
int klasaint::ilosc=0;
template<>
int klasadouble::ilosc=0;
template<>
klasaint** klasaint::stack=new klasaint*[1];
template<>
klasadouble** klasadouble::stack=new klasadouble*[1];
int main()
{
    int a=5;
    double b=21.37;
    int c[]={2,1,3,7};
    double d[]={(6.66),(6.66)};
    klasaint::write(a);
    klasaint::write(c[0]);
    klasaint::write(a);
    klasaint::write(c[0]);
    klasaint::write(c[1]);
    return 0;
}

 

komentarz 22 maja 2020 przez tkz Nałogowiec (42,000 p.)

Kod jest nieładny. Rozdziel re alokowanie pamięci i zapis na dwie osobne funkcję. https://pastebin.pl/view/e90d060c mój stary kod z pierwszego roku studiowania, nie jest najlepszy, ale może coś podchwycisz. 

komentarz 22 maja 2020 przez czarnywilczek Nowicjusz (120 p.)
Dziękuję, z chęcią przejrzę

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

+1 głos
1 odpowiedź 166 wizyt
pytanie zadane 14 kwietnia 2016 w C i C++ przez C☺ndzi Stary wyjadacz (12,100 p.)
+1 głos
1 odpowiedź 510 wizyt
pytanie zadane 14 października 2020 w C i C++ przez Daaa22 Dyskutant (8,250 p.)
0 głosów
1 odpowiedź 262 wizyt

92,547 zapytań

141,388 odpowiedzi

319,506 komentarzy

61,931 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...