PDA

Visualizza la versione completa : [c++]strutture e puntatori


giuseppe500
02-08-2008, 15:03
ciao.
Ho la segunte classe:


struct VERTEX
{
GLfloat val[3];
};


struct INDEX
{
int nVertex;
};
struct FACE
{
INDEX *pIndex;
int nCount;
};

class CPolygon
{
private:
VERTEX * m_vertexs;
int m_nVertexCount;
int m_nFacesCount;
FACE * m_faces;
public:
CPolygon();
void addVertex(GLfloat inVertex[3]);
void addFace(int idx[],int nIDXCount);
virtual ~CPolygon();

void Draw();

};

Ora:
ad es:
struct INDEX
{
int nVertex;
};
struct FACE
{
INDEX *pIndex;
int nCount;
};
nella struttura FACE ho un insieme di puntatori a INDEX giusto?
cosi come m_vertexs è un insieme di puntatori a VERTEX

non voglio usare gli array , per problemi di prestazioni e soprattutto per capire

1)come faccio ad inserire ad es 3 VERTEX in m_vertexs coi puntatori?
in modo che ogni VERTEX sia successivo all'altro?

2)per quanto riguarda FACE:
come faccio ad inserire un elemento FACE con ad es 3 indici che puntano a 3 VERTEX?
e un nCount ad es di 3?

3)non ho capito bene un concetto sugli array chiamato decay to a pointer.
grazie.

menphisx
02-08-2008, 17:49
In VERTEX hai un puntatore, non un insieme, di tipo INDEX.
1) Devi allocare lo spazio per 3 VERTEX, e salvare l'indirizzo dell'allocazione in m_vertexs.
2) Allochi la memoria per un elemento FACE; l'indirizzo di cotale allocazione finirà in m_faces. Accedi dunque alla struttura e all'elemento pIndex. Allochi la memoria necessaria per 3 VERTEX; salvando l'indirizzo in pIndex.
3) Non conosco il significato di quella espressione, quindi non saprei aiutarti.

giuseppe500
02-08-2008, 17:59
Grazie menphisx,ma avevo visto da qualche parte incrementare il puntatore come se fosse un array,ad es:qualcosa del genere:


VERTEX *v = new VERTEX();
m_vertexs++=*v;//element 0
VERTEX *v = new VERTEX();
m_vertexs++=*v;//element 1

ecc...
incrementare un puntatore , ha a che fare con il size della struttura penso .
per es. se volessi accedere all'elemento 3 dell' insieme m_vertexs come dovrei fare con i puntatori?
Sai aiutarmi?soprattutto mi interessa la sintassi.
Grazie.
Ciao.

menphisx
02-08-2008, 18:35
Diciamo che è il contrario: sono i puntatori che si incrementano !
Allora un puntatore contiene un indirizzo di memoria.
Con l'operatore * accedi al contenuto di tale indirizzo.
Con l'operatore & ricavi l'indirizzo di una variabile.
Ora si assegna un tipo al puntatore perchè se no; non si saprebbe come accedere alla memoria corretamente.
Se il puntatore v contiene l'indirizzo 1000 ed è di tipo VERTEX, significa che l'indirizzo del prossimo elemento VERTEX sarà 1000 + dimensione del tipo VERTEX; quindi in generale:
indirizzo base + dimensione_tipo * indice

Ora quando fai v++, incrementi di uno * dimensione_tipo_puntatore l'indirizzo contenuto nel puntatore e poi lo assegni al puntatore stesso.
Con gli array in teoria non si può fare, dato che si usano gli indici, ma allo stesso tempo puoi utilizzare gli indici con i puntatori.
Detto questo il codice che hai postato è solo in parte giusto.
Primo perchè in m_vertexs deve puntare ad una zona di memoria sufficientemente grande da contenere gli elementi. Secondo perchè vengono allocati degli elementi di cui non si tiene traccia, e quindi non si possono disallocare.
Se vuoi accedere all'elemento 3 di m_vertexs, se m_vertexs contiene l'indirizzo dell'elemento 0:
m_vertexs[2]
se no:
m_vertexs[quanto_manca_alla_cella_3]

Se non ti sono stato chiaro, documentati ed informati sull'aritmetica dei puntatori.

:ciauz:

giuseppe500
02-08-2008, 18:53
Detto questo il codice che hai postato è solo in parte giusto. Primo perchè in m_vertexs deve puntare ad una zona di memoria sufficientemente grande da contenere gli elementi. Secondo perchè vengono allocati degli elementi di cui non si tiene traccia, e quindi non si possono disallocare.

1)se la zona di memoria non è abbastanza grande come si fa a saperlo?
2)come faccio ad inserire un dato nella zona di memoria successiva puntata dal puntatore?come alloco il nuovo oggetto e come uso gli indici puoi correggere il mio codice?

Intanto tti ringrazio , e se non vuoi perdere altro tempo ti capisco .
ma hai un tutorial o un buon libro da consigliarmi sull'aritmetica dei puntatori?
Grazie ciao,.

menphisx
02-08-2008, 19:09
Il tuo manuale di C++ dovrebbe parlarne ...
1) In genere si sa quanto è grande, perchè durante la chiamata a malloc o a new si passa il numero di byte da allocare.
2) Sarebbe più corretto fare:



VERTEX *m_vertexs[256] = NULL;
int i = 0;

VERTEX *v = new VERTEX();
m_vertexs[i++] = v; //element 0
VERTEX *v = new VERTEX();
m_vertexs[i++] = v; //element 1

/*...codice...*/

delete m_vertexs[0];
delete m_vertexs[1];


o meglio: utilizzare una lista o un puntatore a puntatore.

Ti consiglio vivamente di leggerti un libro che ti spieghi bene i puntatori.
Io purtroppo non ne conosco, gli ho imparati con l'esperienza.
Forse il K&R ne parla bene, adesso non ricordo ...

Loading