Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 4 odgovora
  • 3.282 pregleda

Najnovija ↓

C++, alociranje memorije za strukturu 19.12.2010. u 18:04 · pre 193 meseca #1
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?
Potpis
"Šta mi vredi što sam pametan kad imam posla sa budalama?"
Re: C++, alociranje memorije za strukturu 19.12.2010. u 18:49 · pre 193 meseca #2
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;
Re: C++, alociranje memorije za strukturu 19.12.2010. u 19:30 · pre 193 meseca #3
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 ;)
Potpis
"Šta mi vredi što sam pametan kad imam posla sa budalama?"
Re: C++, alociranje memorije za strukturu 19.12.2010. u 20:55 · pre 193 meseca #4
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;
}

Re: C++, alociranje memorije za strukturu 20.12.2010. u 00:01 · pre 193 meseca #5
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! ;)
Potpis
"Šta mi vredi što sam pametan kad imam posla sa budalama?"
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme