Wyklad2d PPK sem2 PKos DynamicznaAlokacjaTablic


Programowanie w C/C++
Tematyka
" Dynamiczna alokacja tablic
Przypomnienie
Dynamiczna alokacja tablicy 1-wymiarowej
double *pd;
pd = new double[rozmiar];
delete [] pd;
rozmiar tablicy
nie musi
być stałą
Krócej:
double* pd = new double[rozmiar];
delete [] pd;
Uwaga: nie wolno pomylić operatora delete [] z podobnym operatorem
delete.
Dynamiczna tablica dwuwymiarowa jest tablicą wskazników do tablic
jednowymiarowych
A typ** A
typ**
A[0][0]
A[0]
typ* typ typ typ
A[1]
typ* typ typ typ
A[nw-1]
typ* typ typ typ
Dynamiczna tablica dwuwymiarowa jest tablicą wskazników do tablic
jednowymiarowych
0x10 double** A
0x20
0x30 0x38 0x40
0x20
0x30 1.56 2.43 3.15
0x48 0x50 0x58
0x24
0x48
3.01 2.23 0.87
Dynamiczna alokacja tablicy (1)
Przykład 1. Dynamiczna alokacja tablicy 2-wymiarowej o z góry ustalonej liczbie
wierszy (W) i kolumn (K).
const W=4; // liczba wierszy tablicy
const K=3; // liczba kolumn tablicy
typedef double tt[K]; // tt typ - tablica double [K];
// sizeof(tt) = K * sizeof(double)
typedef double s[W][K]; // s typ - wskaznik typu double (*) [K]
// sizeof(s) = W*K*sizeof(double)
void main(void)
{ int i,j, l=0;
tt *tab1; // tab1 wskaznik typu tt;
tab1 = new s; // tablica dynamiczna typu s
// sizeof(s) = W*K*sizeof(double) = 96
if (!tab1) cout << "Błąd alokacji" << endl;
else { for (i=0; ifor (j=0; j{ tab1[i][j] = l++; cout << tab1[i][j]; }
cout << endl; }
delete [] tab1; tab1=NULL; // zwolnienie pamięci
}
}
Dynamiczna alokacja tablicy (2)
Przykład 2. Dynamiczna alokacja tablicy 2-wymiarowej o zmiennej liczbie
wierszy (operator new).
const K=3;
typedef double tt[K]; // tt typ - tablica double [K];
// sizeof(tt) = K * sizeof(double)
void main(void)
{ int i,j,l=0;
int nw; // liczba wierszy tablicy
int nk; // liczba kolumn tablicy
cout << "Podaj liczbe wierszy tablicy, np. 4" << endl;
cin >> nw; // nw=4
tt *tab2; // double (*) [K];
// sizeof(tt)=K*sizeof(double)=24
tab2 = new tt [nw]; // nw elementów typu tt;
// 4*sizeof(tt)=96
if (!tab2) cout << "Blad alokacji" << endl;
else { for (i=0; ifor (j=0; jcout << endl; }
delete [] tab2; tab2=NULL; // zwolnienie pamięci dla new
}
}
Dynamiczna alokacja tablicy (3)
Przykład 3. Dynamiczna alokacja tablicy 2-wymiarowej o zmiennej liczbie
wierszy (funkcja malloc).
void main()
{
...
// Alokacja tablicy 2 wym. o zadawanej liczbie
// wierszy nw i stałej liczbie kolumn K
//- wykorzystanie malloc
cout << "Podaj liczbe wierszy tablicy: ";
cin >> nw;
tt *tab3; // double (*tab) [K];
// sizeof(tt)=K*sizeof(double)=24
tab3 = (tt*) malloc(nw*sizeof(tt)); // tab3 jest wskaznikiem
// do tt
// tab3 = (tt*) calloc(nw,sizeof(tt)); // tab3 wypelniona
// zerami
...
// dostęp do tablicy tab3[i][j]
...
free(tab3); tab3 = NULL; // zwolnienie pamięci
}
Dynamiczna alokacja tablicy (4)
Przykład 4. Dynamiczna alokacja tablicy 2-wymiarowej o zmiennej liczbie
wierszy (nw) i zmiennej liczbie kolumn (nk).
double * *A; // wskaznik do tablicy wskazników na double
// reprezentacja tablicy nw wskazników na tablice nk
// elementowe typu double
cout << "Podaj liczbe wierszy tablicy, np. 4" << endl; cin >> nw; // 4
cout << "Podaj liczbe kolumn tablicy, np. 3" << endl; cin >> nk; // 3
A = new double * [nw]; // tablica nw wskazników na double
// służy do pamiętania adresów
// dynamicznych tablic nk elementowych
// A = (double**) malloc(nw*sizeof(*A)); // wykorzystanie malloc
// A = (double**) calloc(nw, sizeof(*A)); // wykorzystanie calloc
if (!A) cout << "Blad alokacji" << endl;
else { for (i=0; i < nw; i++) // nw dynamicznych tablic
{if ( (A[i] = new double [nk]) == NULL ) // nk-elementowych
{ cout << "Blad alokacji" << endl; exit(0); }
}
}
for (i=0; i < nw; i++) delete [] A[i]; // usuwanie nw tablic
// nk-elementowych
delete [] A; // usuwanie tablicy wskazników A
// free(A); // usuwanie dla malloc
}
Dynamiczna alokacja tablicy  najprościej
Schemat dynamicznej alokacji tablicy 2-wymiarowej o zmiennej liczbie wierszy
(nw) i zmiennej liczbie kolumn (nk).
int **A;
A = new int *[nw];
for (int i=0;ilub krócej
int **A = new int *[nw];
for (int i=0;iZwalnianie pamięci
for (i=0; i < nw; i++) delete [] A[i]; // usuwanie nw tablic
// nk-elementowych
delete [] A;


Wyszukiwarka

Podobne podstrony:
Wyklad3a PPK sem2 PKos ProgObiek Przyklady
Wyklad2c PPK sem2 PKos WstepDoProgramObiektowego
Wyklad2a PPK sem2 PKos ProgramowanieZaawansowane?
Wyklad2b PPK sem2 PKos AlgorytmyRozne 1
Wyklad1 PPK sem2 PrzegladFunkcjePrzecInne PKos StudForum
Wyklad3b PPK sem2 KonstruktoryDestr
Wyklad4(dynamika2014czesc3 )
Dynamika Budowli wyklad 4 11 12
Wyklad 3 Dynamika punkty materialnego
Pozycjonowanie dynamiczne wykład
wyklad18 dynamika relatywistyczna
wykład 2 dynamika
Wykład 6 Dynamika Mechanizmów Analiza kinetostatyczna B (1)
PPK wykład

więcej podobnych podstron