np. źle rozumiem pojęcie "wielkość" |
wielkość tablicy, czyli rozmiar w nawiasie kwadratowym.
Statyczna tablica musi mieć tam wartość stałą np. np.
const int rozmiar = 10;
int tab[ rozmiar ];
lub
int tab[ 10 ];
a dynamicznie nie musi być to wartość stała
int rozmiar;
cout << "Podaj wielkosc tablicy: ";
cin >> rozmiar;
int * wtab = new int[ rozmiar ];
Są różnice w wydajności programów z alokacją dynamiczną i statyczną i tutaj programer musi zdecydować czego potrzebuje.
Służy temu, że piszesz nap bazę informacji i nie wiesz ile dokładnie ma ich być.
Deklarujesz nieduża tablice dynamicznie i jej używasz.
Teraz jest sytuacja, że zapełniasz ostatni element tablicy, a potrzebujesz jeszcze kilka nowych,
więc warunkujesz w programie, "jeśli ostatni element jest zapisany dołóż do programu następne
elementy tablicy.
Wtedy robisz tak:
1. zamiast tego
int * wsk = new int[ 10 ];
deklarujesz
* wsk = new int[ rozmiar ]
gdzie rozmiar jest zmienna całkowita, ale juz nie musi być
const int rozmiar = 10;
.
2. zmieniasz wartość zmiennej "rozmiar" i program w czasie wykonywania alokuje nową pamieć
na tyle elementów ile właśnie potrzebujesz.
3. Następnie kopiuje elementy tablicy ze starego miejsca na nowo utworzone.
Można zrobić to tak:
int * zwiekszTab( int * w_wartosci, int * rozmiar )
{
* rozmiar *= 2;
int * w_nowe_wartosci = new int[ * rozmiar ];
for( int i = 0; i < * rozmiar; ++i )
{
w_nowe_wartosci[ i ] = w_wartosci[ i ];
}
delete[] w_wartosci;
return w_nowe_wartosci;
}
jest to fragment funkcji zajmujący się powiększaniem tablicy na bieżąco.
Krok 1. przekazujemy zapełnioną tablice i jej rozmiar.
Krok 2. podwajamy wartość zmiennej "rozmiar".
Krok 3. alokujemy nową dynamiczną tablice i do niej kopiujemy ze starej tablicy.
Krok 4. usuwamy starą tablicę w przykładzie "w wartości" i zwracamy nową tablicę w miejsce skąd była wywołana.
Krok 5. cieszymy się, że mamy nową większą tablicę póki znów się nie zapełni, wtedy znów wywołujemy funkcję zwiększająca tablicę itd.
Daje nam to tyle, że można w miarę upływu czasu, powiększać zasoby nie zajmując niepotrzebnie miejsca.
Statycznie musisz przydzielić stałą ilość pamięci (w trakcie kompilowania) i się jej kurczowo trzymać, dynamiczna daje swobodę
zmiany wielkości w trakcie działania programu. Ustawiasz warunek, który wykrywa, że tablica jest pełna i ją np. podwaja.[/code]