[ smez @ 19.12.2010. 17:04 ] @
Imam jedan od onih problema o kojima guglaš po' sata a nigde ne možeš da nađeš rešenje.. Koristim DevCpp i puca kada se alocira veća memorija. A vrrrrrrlo mi je neophodna.

Prolazi:
Code:
struct pix {
    unsigned char B, G, R;
} pic[800][800];


A treba mi, i ne prolazi:
Code:
struct pix {
    unsigned char B, G, R;
} pic[900][900];


Takođe ne prolazi ni:
Code:
struct pix {
    unsigned char B, G, R;
} pic[800][800], pic2[800][800];


A čisto da se uporedi sa prvim ne prolazi ni:
Code:
struct pix {
    unsigned char B, G, R;
        int abc;
} pic[800][800];


Kad kažem "ne prolazi" to znači da puca pri startovanju, neće da se pokrene.

Kako alocirati više memorije?
[ X Files @ 19.12.2010. 17:49 ] @
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;
[ smez @ 19.12.2010. 18:30 ] @
Jasno mi je oko steka i hipa. Davno sam se igrao sa tim u C-u.

Nego smotan sam i zaglavljuje mi ovde:

Code:
Matrix <PT> MyMatrix(800,800);


Gde izbacuje grešku:
Code:
`main(int, char**)::PT' uses local type `main(int, char**)::PT' 
trying to instantiate `template<class T> class Matrix' 
invalid type in declaration before '(' token 
initializer expression list treated as compound expression 


Primera radi, ako promenim tip iz PT u int:
Code:
Matrix <int> MyMatrix(800,800);

onda prolazi.

Preblem je sada u templateu? Nikad nisam radio sa njima. Pogušavam da nađem slično rešenje ali ne ide.. Ako bi mogao još to da otpetljaš bio bih ti veoma zahvalan ;)
[ X Files @ 19.12.2010. 19:55 ] @
Nemam DevC++ na racunaru.

Probao sam sada sa Code::Blocks i GCC, ovo radi:
Code:

#include <iostream>
using namespace std;

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];
    }
};

struct pix {
    unsigned char B, G, R;
};
typedef struct pix PT;


int main()
{

    Matrix <PT> MyMatrix(800,800);

    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;

    return 0;
}

[ smez @ 19.12.2010. 23:01 ] @
Jesam debil. Greška mi je bila samo u tome što sam struct i typedef stavio u main. Nije se pri kompilaciji bunio pa sam mislio da ne smeta da bude tu. Sada kada sam izvadio napolje radi kako treba. Hvala veliko! ;)