Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

C++, alociranje memorije za strukturu

[es] :: C/C++ programiranje :: C/C++ za početnike :: C++, alociranje memorije za strukturu

[ Pregleda: 1986 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

smez
smederevo

Član broj: 68016
Poruke: 4
*.ptt.rs.



Profil

icon C++, alociranje memorije za strukturu19.12.2010. u 17:04 - pre 147 meseci
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?
"Šta mi vredi što sam pametan kad imam posla sa budalama?"
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4898
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+637 Profil

icon Re: C++, alociranje memorije za strukturu19.12.2010. u 17:49 - pre 147 meseci
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;
 
Odgovor na temu

smez
smederevo

Član broj: 68016
Poruke: 4
*.ptt.rs.



Profil

icon Re: C++, alociranje memorije za strukturu19.12.2010. u 18:30 - pre 147 meseci
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 ;)
"Šta mi vredi što sam pametan kad imam posla sa budalama?"
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4898
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+637 Profil

icon Re: C++, alociranje memorije za strukturu19.12.2010. u 19:55 - pre 147 meseci
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;
}

 
Odgovor na temu

smez
smederevo

Član broj: 68016
Poruke: 4
*.ptt.rs.



Profil

icon Re: C++, alociranje memorije za strukturu19.12.2010. u 23:01 - pre 147 meseci
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! ;)
"Šta mi vredi što sam pametan kad imam posla sa budalama?"
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: C++, alociranje memorije za strukturu

[ Pregleda: 1986 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.