Tablica dynamiczna i jej usuwanie

0

Witam problem jest nastepujacy, po nacisnieciu "b" pamiec sie czysci z tablicy, ale gdy wcisnę ten klawisz na początku programu, tzn na jeszcze nie stworzonej tablicy to program się wywala. Próbowałem wszelakie if'y, else'y i nic. Nie mam bladego pojęcia jak to zrobić tak, żeby usuwało tablice gdy jest stworzona ale nie wywalało programu gdy jest niestworzona.

#include <iostream>
#include <cstdlib>
#include <time.h>

using namespace std;

void wpisywanie_elementow(int *tab,int n);
void losowanie_elementow(int *tab,int n);
void posortowanie(int *tab,int n);
void odwrotnie_posortowanie(int *tab, int n);

int main()
{
	char wybor=getchar();
	int n;
	int *tab=NULL;
	
	do
	{
    cout << "1. Tworzenie dynamicznej tablicy" << endl;
    cout << "2. Podawanie recznie elementow tablicy"<< endl;
    cout << "3. Generowanie danych losowych"<< endl;
    cout << "4. Generowanie danych posortowanych"<< endl;
    cout << "5. Generowanie danych odwrotnie posortowanych"<< endl;
    cout << "6. Sortowanie babelkowe "<< endl;
    cout << "7. Sortowanie babelkowe z flaga"<< endl;
    cout << "8. Selectionsort"<< endl;
    cout << "9. Sortowanie przez wstawianie"<< endl;
    cout << "a. wypisanie tablicy"<< endl;
    cout << "b. czyszczenie tablicy"<< endl;
    cout << "0. Koniec "<< endl;
    cin >> wybor;
    
    system("cls");
    
    switch( wybor )
	{
    case '1':
        cout << "Podaj ile elementow ma miec tablica" << endl;
        cin >> n;
    	tab = new int[n];
    break;
    
    
    case '2':
    		wpisywanie_elementow(tab, n);
    break;
    
    case '3':
    		losowanie_elementow(tab,n);
    break;
    
    case '4':
    		posortowanie(tab,n);
    break;
    
    case '5':
    		odwrotnie_posortowanie(tab,n);
    break;
    
    
    case 'a':
    	for(int i=1; i<=n; i++)
    	{
    		cout << tab[i] << endl;
		}	
    break;
    
    case 'b':

	
		delete [] tab;
	
    break;
    
}
    }while(wybor!='0');
    
return 0;
}
1

Z perspektywy użytkownika programu, nie powinna być dopuszczalna sytuacja zarządzania pamięcią dynamiczną.
Usuń pierwszy punkt i połącz go z wypełnianiem tablicy.
Następnie powinieneś przy każdym działaniu, wymagającym uzupełnionej tablicy zaimplementować sprawdzenie, czy wskaźnik na tablice nie jest pusty (komentarz pod Twoim postem).

Powinieneś też zadbać o kasowanie tablicy jeśli uzytkownik tego nie zrobił.

1

Jeśli to nie jest jakiś szkolny projekt: https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete/

0

Polecam używać vector`a , jeśli piszesz w c++ to korzystaj z jego dobrodziejstw :). Wtedy zamiast delete możesz zrobić to za pomocą clear. Program nie wywali Ci się nawet jak vector nie będzie miała żadnych elementów. Twoje funkcje pozbędą się jednego parametru 'n' , który prawdopodobnie oznacza wielkość wprowadzanej tablicy, bo osiągniesz to samo za pomocą: size.

0

Okej wszystko już ogarnąłem à propos tego, ale pojawia się kolejny problem z moim programem. Za każdym razem gdy ustawię wielkośc tablicy na 10 a następnie ją wyświetlam to program wywala. Dzieje się to niezależnie czy wprowadze to ręczenie, losowo czy posortowanie. Tylko przy wartości n=10 każda inna wartość działa poprawnie. Jakieś pomysły?

0
        for(int i=0; i<n; i++)
        {
            cout << tab[i] << endl;
        } 

Nie powinno być przypadkiem tak?

0

chce aby moja tablica zaczynala sie od indeksu 1 na potrzeby pozniejszego sortowania z wykorzystaniem indeksu 0

0

Nie rozumiem, a co z indeksem 0, przecież nie możesz tak o sobie go usunąć, on tam dalej jest i zawsze będzie jeśli mamy indeks 1 , to przed nim jest indeks 0, zawsze.

A ostatnim indeksem w przypadku n=10 jest idenks 9 a nie 10, tak jak masz napisane w tej pętli:

        for(int i=1; i<=10; i++)
        {
            cout << tab[i] << endl;
        } 

To program przy i = 10 się wywali , bo nie ma takiego indeksu.

0

Rozwiązałem już ten problem z tablicą i wszystko działa poprawnie, ale odwołam się do początkowego problemu ponieważ pomimo zastosowania tych if'ów które w komentarzu ktoś mi dopisał nadal to nie działa. Jak ma wyglądać taki warunek if w każdym case? Bo tutaj logiczne że nie da się nic wpisać do nieutworzonej tablicy. Dla przykładu:

case '1':
        cout << "Podaj ile elementow ma miec tablica \n";
        cin >> n;
        
        if (n>1)
        {
        	tab = new int[n+1];		
		}
		
		if(n<1)
		{
			cout << "tablica nie moze byc pusta \n";
		}
    break;
    
    
    case '2':
    	wpisywanie_elementow(tab, n);
    break;

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