2011-05-24 2 views
0

Je ne pouvais pas comprendre comment déréférencer ce pointeur ...je ne pouvais pas comprendre comment déréférencer ce pointeur pour une sizeof() et pointeurs vides

sizeof (shapetest2-> tripsName) dans cette ligne ci-dessous, il ne va évidemment pas fonctionner parce que c'est un pointeur, je ne pouvais pas comprendre comment le déréférencer? (est-ce facile ou est-ce quelques étapes ?, j'ai essayé plusieurs choses, mais je n'ai pas pu me rapprocher) Je ne suis pas une expérience assez codeur pour comprendre cette circonstance particulière.

glBufferSubData (GL_ELEMENT_ARRAY_BUFFER, 0, taille de (shapetest2-> tripsName), shapetest2-> tripsName);

Voici le code d'installation. (J'expérimente avec un VOB dans OpenGL ES 1.5, donc si cela semble étrange, c'est pourquoi) si j'ai oublié une installation importante ou des définitions, ou du code, faites le moi savoir et je l'inclurai.

GLsizeiptr dataSize; 
GLsizeiptr indexSize; 

typedef struct shapeBase { 
    void *stripsName[maxStrips]; 
    void *tripsName; 
    void *fansName; 
    int totStrips; 
    int stripsNum[maxStrips]; 
    int tripsNum; 
    int totFans; 
    int fansBgn[maxStrips]; 
    int fansNum[maxStrips]; 
    void *dataName; 
    void *listOfInserts; 
    Vertex3D center; 
    Vertex3D radius; 
    int damageMax; 
    float weight; 
    GLuint bufferName; 
    GLuint indexName; 
} shapeBase; 

static const GLushort test2Trips[] = 
{ 
    0, 1, 3, 1, 2, 3, 
    4, 5, 7, 5, 6, 7, 
    8, 9, 11, 9, 10, 11, 
    12, 13, 15, 13, 14, 15, 
    16, 17, 19, 17, 18, 19, 
    20, 21, 23, 21, 22, 23, 
    24, 25, 27, 25, 26, 27, 
    28, 29, 31, 29, 30, 31, 
    32, 33, 35, 33, 34, 35, 
    36, 37, 39, 37, 38, 39, 
    40, 41, 43, 41, 42, 43, 
    44, 45, 47, 45, 46, 47, 
}; 

//------------------------- 
static inline void shapetest2Setup(void) 
{ 
    shapetest2 = malloc(sizeof(shapeBase)); 
    shapetest2->stripsName[1] = NULL; 
    shapetest2->tripsName  = &test2Trips; 
    shapetest2->fansName  = NULL; 
    shapetest2->dataName  = &test2Data; 
    shapetest2->totStrips  = 0; 
    shapetest2->stripsNum[1] = 0; 
    shapetest2->tripsNum  = 72; 
    shapetest2->totFans  = 0; 
    shapetest2->listOfInserts = NULL; 
    shapetest2->center  = Vertex3DMake(0.000000, -0.000000, 2.000000); 
    shapetest2->radius  = Vertex3DMake(1.000000, 1.000000, 2.000000); 

    dataSize = sizeof(test1Data) + sizeof(test2Data); 

    glGenBuffers(1, &mainBuffer); 
    glBindBuffer(GL_ARRAY_BUFFER, mainBuffer); 
    glBufferData(GL_ARRAY_BUFFER, dataSize, NULL, GL_STATIC_DRAW); 

    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(test1Data), test1Data); 
    glBufferSubData(GL_ARRAY_BUFFER, sizeof(test1Data), sizeof(test2Data), test2Data); 

// glGenBuffers(1, &shapetest2->indexName); 
// glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, shapetest2->indexName); 
// glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(test2Trips), test2Trips, GL_STATIC_DRAW); 


    indexSize = sizeof(test1Trips) + sizeof(test2Trips); 

    glGenBuffers(1, &mainIndex); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mainIndex); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexSize, NULL, GL_STATIC_DRAW); 
} 


//------------------------------------------------------ 
static inline void DrawOutShape(void) 
{ 
    glBindBuffer(GL_ARRAY_BUFFER, mainBuffer); 


    glVertexPointer(3, GL_FLOAT, sizeof(VertexData3D), (void*)0); 
    glNormalPointer(GL_FLOAT, sizeof(VertexData3D), (void*)12); 

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mainIndex); 

// glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(theInsert->insertName->tripsName), theInsert->insertName->tripsName); 

// glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(test1Trips), test1Trips); 
// glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, sizeof(test1Trips), sizeof(test2Trips), shapetest2->tripsName); 

    glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(shapetest2->tripsName), shapetest2->tripsName); 


     glDrawElements(GL_TRIANGLES, theInsert->insertName->tripsNum, GL_UNSIGNED_SHORT, (void*)0); 


    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 


polys += theInsert->insertName->tripsNum; 

} 

(l'insert est une poignée (pointeur vers pointeur) de la shapetest2, vous pouvez donc shapetest2 remplacer si vous voyez « theInsert-> insertName »)

si je commente la ligne incriminée, et uncomment la ligne ci-dessus, cela fonctionne, mais j'ai besoin de cette indirection, (et en fait j'ai besoin d'un autre niveau d'indirection que vous pouvez voir dans une autre ligne commentée) mais si je peux comprendre comment déréférencer cette ligne, je devrais pouvoir le faire pour un autre niveau d'indirection?)

Répondre

2

sizeof est une constante de compilation qui fonctionne sur le type exact que vous fournissez. sizeof de void* est juste une taille de pointeur sur votre machine (probablement 4/8 octets). Juste stocker la taille avec d'autres données.

+0

ok merci, j'espérais que c'était possible, on dirait que vous avez la meilleure solution de travail, merci, et que c'était sûr ... wow. – hokkuk

Questions connexes