Zmiana rozmiaru tablicy w trakcie działania programu

Odpowiedz Nowy wątek
2018-08-23 15:19
0

Witam,
Piszę obecnie program, który wczyta dane dowolnej liczby osób, a potem na żądania uzytkownika je wyswietli.
Mam problem ze zmianą rozmiaru tablicy, tak aby mozna było zapisać dowolną ilość danych (po uruchomieniu w pewnym momencie pojawia się: terminate called after throwing an instance of 'std::bad_alloc'what(): std::bad_alloc)

Mój kod:

#include <iostream>

using namespace std;

struct Dane
{
    string imie;//docelowo ma być więcej danych (nazwisko, wiek itp), stąd struktura.
};

Dane *zwieksz_ksiazke(Dane *ksiazka, int *rozmiar)//podwaja rozmiar tablicy
{
    *rozmiar= (*rozmiar)*2;
    Dane *nowa_ksiazka=new Dane[*rozmiar];
    for(int i=0;i< *rozmiar;i++)
    {
        nowa_ksiazka[i]=ksiazka[i];
    }
    delete[]ksiazka;
    return nowa_ksiazka;
}

Dane wczytaj_pozycje(Dane &pozycja,int nr_pozycji)
{
    cout<<"podaj imie nr: "<<nr_pozycji<<" \n";
    cin>>pozycja.imie;
    return pozycja;
}

void wczytaj_ksiazke(Dane *ksiazka,int *rozmiar)//wczytuje imiona dopóki uzytkownik nie wybierze 0.
{
    int wybor=1;
    int nr_pozycji=1;
    while(wybor!=0)
    {
        if(nr_pozycji<=*rozmiar)
        {
            wczytaj_pozycje(ksiazka[nr_pozycji-1],nr_pozycji);
            nr_pozycji++;
            cout<<"wybierz 1 dla dalszego wczytywania, 0 aby zakonczyc: ";
/*po wyborze 1 pojawia się w konsoli komunikat:terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc*/
            cin>>wybor;
        }
        else
        {
            ksiazka=zwieksz_ksiazke(ksiazka,rozmiar);
        }
    }
    cout<<"zakonczono";
}

int main()
{
    int rozmiar=1;
    Dane *ksiazka=new Dane[rozmiar];
    wczytaj_ksiazke(ksiazka,&rozmiar);
    return 0;
}

Z góry dzięki za pomoc!

edytowany 2x, ostatnio: furious programming, 2018-08-23 17:02

Pozostało 580 znaków

2018-08-23 15:51
4

Jezeli nie musisz korzystac z tablic to prosi sie o uzycie vectora.
http://cpp0x.pl/kursy/Kurs-ST[...]ntener-tablicy-std-vector/119
https://en.cppreference.com/w/cpp/container/vector

Polecam takze wpis KrzaQ, ktory pozwoli Ci poznac temat.
https://dsp.krzaq.cc/post/176[...]xx-kiedy-uzywac-new-i-delete/


Brak polskich znakow :(
edytowany 2x, ostatnio: qblacksheep, 2018-08-23 15:57

Pozostało 580 znaków

2018-08-23 16:36
1

Pomijając już powyższe:

Dane *zwieksz_ksiazke(Dane *ksiazka, int *rozmiar)//podwaja rozmiar tablicy
{
    *rozmiar= (*rozmiar)*2;
    Dane *nowa_ksiazka=new Dane[*rozmiar];
    for(int i=0;i< *rozmiar;i++)
    {
        nowa_ksiazka[i]=ksiazka[i];
    }
    delete[]ksiazka;
    return nowa_ksiazka;
}

Po co wprowadzasz rozmiar tablicy przez wskaźnik?
W pętli wychodzisz poza zakres ksiazka - dajmy na to, że rozmiar miał wartość 5 na wejściu do funkcji. Więc zapewne rozmiar ksiazka ma indeksy od 0 do 4. Zwiększasz rozmiar, a potem odwołujesz się do wartości spoza tablicy.
Robienie delete[] na argumencie funkcji to też nie najlepszy pomysł.


Pozostało 580 znaków

2018-08-23 16:45
0

Dzięki wielkie za pomoc!
Dopiero zaczynam naukę C++ i nie znam jeszcze wektorów, ale postaram się to szybko nadrobić.

to olej wskaźniki i czytaj od razu o wektorach i tego typu rzeczach. Język piękny, tylko ciężko znaleźć dobre źródło do nauki. https://helion.pl/ksiazki/pro[...]troustrup,pcppt2.htm#format/d na start powinna być w sam raz : ) - Tenonymous 2018-08-23 17:04
Uczę się z "Przewodnika dla początkujących" A. Allain'a. Myślisz, że Twoja książka będzie dobra też po przeczytaniu tej, którą mam? - ROGU 2018-08-23 18:13
Nie znam tej książki, ale patrząc po kodzie to bym ją odstawił. :P Ale tak, powinna być dobra. Opcjonalnie druga książka tego samego autora, Język C. Kompendium wiedzy. - Tenonymous 2018-08-23 18:17

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0