Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++]strutture e puntatori

    ciao.
    Ho la segunte classe:
    codice:
    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.

  2. #2
    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.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    Grazie menphisx,ma avevo visto da qualche parte incrementare il puntatore come se fosse un array,ad es:qualcosa del genere:
    codice:
       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.

  4. #4
    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.


  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    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,.

  6. #6
    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:
    codice:
    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 ...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.