Postoje dva osnovna mesta gde programi alociraju memoriju: stack, heap. Na ES-u se pretragom moze pronaci nesto tekstova o ovome.
Ukratko, stack je relativno malo skladiste, koje ima privremeni karakter. Heap je memorija u koju ti zelis da smestis matricu, ali je ona ocigledno otisla na heap, pa ce shodno podesavanjima kompajlera i program pucati ili nece.
Postoji nekoliko nacina da resis ovaj problem:
1. Najlosije: Da kroz opcije okruzenja povecas Stack. Medjutim, imaj u vidu da ti to nece preterano pomoci, jer dizanje na kvadrat posle izvesnog broja postaje strahovito zahtevno.
2. Bolje: Dinamicka alokacija memorije. Zauzima se Heap. Ovaj pristup je los jer je memorija alocirana cak i kada se ne koriste svi zauzeti elementi.
3. Najbolje: Koristiti liste za smestanje podataka, jer je zauzece memorije optimalno - zauzima se samo ono sto je potrebno.
S obzirom da se ovo pitanje najvise tice stack-a i heap-a, evo jedno netestirano resenje (netestirano, jer sam Matrix sablon skinuo trenutno s neta bez ikakve provere kvaliteta, mada mi deluje Ok):
Template koji olaksava dinamicko kreiranje matrice objekata
Code:
template <class T> class Matrix {
T **data;
unsigned int x, y;
public:
Matrix(unsigned int w, unsigned int h) {
x = w;
y = h;
data = new T *[w];
for(unsigned int a=0; a<w; a++) {
data[a] = new T[h];
}
}
~Matrix(void) {
for(unsigned int a=0; a<x; a++) {
delete [] data[a];
}
delete [] data;
}
inline T *operator [] (unsigned int a) {
return data[a];
}
};
Tvoja struktura, koju promovisemo i u tip
Code:
struct pix {
unsigned char B, G, R;
};
typedef struct pix PT;
Objekti na Heap-u
Code:
MyMatrix <PT> MyMatrix(800,800);
Pristup elementima
Code:
// ...
#include "iostream";
using namespace std;
// ...
MyMatrix[0][0].B = '1';
MyMatrix[0][0].G = '2';
MyMatrix[0][0].R = '3';
MyMatrix[799][799].B = '7';
MyMatrix[799][799].G = '8';
MyMatrix[799][799].R = '9';
cout << MyMatrix[0][0].B << MyMatrix[0][0].G << MyMatrix[0][0].R << endl;
cout << MyMatrix[799][799].B << MyMatrix[799][799].G << MyMatrix[799][799].R << endl;