Przypisanie tablicy pod buffor crashuje program

Odpowiedz Nowy wątek
2019-11-16 16:32
0

Witam, mam problem, muszę napisać program, który wykonuje parę operacji, ale problem póki co jest w jednej tylko (bo dopiero jedną napisałem), program ma za zadanie dodać do tablicy dynamicznej kolejne wartości, ale wpierw ją musi rozszerzyć, problem w tym, że podczas przypisywania tablicy pod buffor, crashuje się program, czy mógłby ktoś pomóc z tym? Problem występuje w funkcji "dodawanie_elementu".

#include <iostream>
using namespace std;

int n,*tab1, *buff;

int tworzenie_tablicy()
{
    cout<<"Podaj rozmiar tablicy = ";
    cin>>n;
    cout<<endl;
    int *tab1 = new int[n];
    for (int i=0;i<n;i++)
    {
        cout<<"Podaj "<<i+1<<" wartosc tablicy = ";
        cin>>tab1[i];
    }
}

void dodawanie_elementu(int n)
{
    int x;
    int *buff = new int[n];
    cout<<"Ile elementow chcesz dodac?"<<endl<<"x = ";
    cin>>x; //Ile elementow dodać
    for (int i=0;i<n;i++)
        buff[i]=tab1[i]; //Przypisanie tablicy tab1 pod buffor
    tab1 = new int[n+x]; //Zresetowanie tablicy tab1 i rozszerzenie jej
    for (int i=0;i<n;i++)
        tab1[i]=buff[i]; //Przypisanie poprzednich znakow pod tab1 z buffora
    for (int i=n;i<n+x;i++)
    {
        cout<<"Podaj "<<n+1<<" wyraz = ";
        cin>>tab1[i]; //Dopisanie nowych znakow
    }
}

void usuwanie_elementu()
{

}

void tablica_parzysta()
{

}

void wyswietlenie_tablic()
{

}

void wyjscie()
{

}

void wybor_operacji()
{
    int x;
    cout<<"Program umozliwia wykonywanie, dla tablicy jednowymiarowej dynamicznej liczb calkowitych wybranej operacji"<<endl;
    do
    {
        cout<<endl<<"Wybierz operacje"<<endl<<endl<<"1. Utworzenie wlasnej tablicy"<<endl<<"2. Dodanie nowego elementu"<<endl<<"3. Usuwanie istniejacego elementu"<<endl<<"4. Utworzenie tablicy zawierajacej elementy parzyste"<<endl<<"5. Wyswietlenie tablicy"<<endl<<endl;
        cout<<"Wybor = ";
        cin>>x;
        cout<<endl;
        switch (x)
        {
        case 1:
            {
                tworzenie_tablicy();
                break;
            }
        case 2:
            {
                dodawanie_elementu(n);
                break;
            }
        case 3:
            {
                usuwanie_elementu();
                break;
            }
        case 4:
            {
                tablica_parzysta();
                break;
            }
        case 5:
            {
                wyswietlenie_tablic();
                break;
            }
        case 0:
            {
                wyjscie();
                break;
            }
        default:
            {
                cout<<"Brak takiej opcji"<<endl;
                break;
            }
        }
    }
    while (x!=0);
}

int main()
{
    wybor_operacji();

}
2019-11-16 16:35
0

int *tab1 = new int[n]; - nie działa w C++ (za wyjątkiem jednego kompilatora).
... impreza mocno zakrapiana ...


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon, 2019-11-16 16:47
Hę ? (to po góralsku) - AnyKtokolwiek 2019-11-16 16:41

Pozostało 580 znaków

2019-11-16 16:47
2
May2Bee napisał(a):
void dodawanie_elementu(int n)
{
    int x;
    int *buff = new int[n];
    cout<<"Ile elementow chcesz dodac?"<<endl<<"x = ";
    cin>>x; //Ile elementow dodać
    for (int i=0;i<n;i++)
        buff[i]=tab1[i]; //Przypisanie tablicy tab1 pod buffor
    tab1 = new int[n+x]; //Zresetowanie tablicy tab1 i rozszerzenie jej
    for (int i=0;i<n;i++)
        tab1[i]=buff[i]; //Przypisanie poprzednich znakow pod tab1 z buffora
    for (int i=n;i<n+x;i++)
    {
        cout<<"Podaj "<<n+1<<" wyraz = ";
        cin>>tab1[i]; //Dopisanie nowych znakow
    }
}

Cieknie i to strasznie. Użyj std::vector.
Nie wiem czy jesteś świadomy, ale c++ nie ma garbage collector i wszytko co zaalokujesz musisz samemu zwolnić.

May2Bee napisał(a):
int n,*tab1, *buff;

Jaka twoim zdaniem jest początkowa wartość n?

edytowany 3x, ostatnio: nalik, 2019-11-16 16:58
2 x new : 0 x delete - hmmm, urżnięty ale coś tam kumam :D - _13th_Dragon 2019-11-16 16:50
Powiedzmy, że ma interfejs garbage collectora: konstruktor - destruktor, ale ich liczba ciągle musi się zgadzać:) - lion137 2019-11-16 16:53
Jak na razie w C++ nie ma garbage collectora. - _13th_Dragon 2019-11-16 16:56
Nie ma, dlatego napisałem "interfejs". - lion137 2019-11-16 16:57

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