2011-05-24 2 views
0

Я не мог понять, как разыменовать этот указатель ...я не мог понять, как разыменовать этот указатель для SizeOf() и недействительных указателей

SizeOf (shapetest2-> tripsName) в этой строке ниже, он, очевидно, не будет работать, потому что это указатель, я не мог понять, как его разыгрывать? (это легко? или это несколько шагов?), я пробовал несколько вещей, но не мог приблизиться). Я не достаточно опытный кодер, чтобы понять это конкретное обстоятельство.

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

вот установочный код. (я экспериментирую с VOB в openGL ES 1.5, поэтому, если это выглядит странно, вот почему), если я забыл какую-то важную настройку или определения или код, дайте мне знать, и я включу его.

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; 

} 

(theInsert является ручка (указатель на указатель) на shapetest2, так что вы можете заменить shapetest2, если вы видите «theInsert-> insertName»)

если я закомментировать строку, вызвавшую, и раскомментируйте строка выше, она работает, но мне нужна эта косвенность (и на самом деле мне нужен другой уровень косвенности, который вы можете увидеть в другой прокомментированной строке), но если я смогу понять, как разыгрывать эту строку, я должен уметь сделать это для другого уровня косвенности?)

ответ

2

sizeof - постоянная времени компиляции, которая работает с точным типом, который вы предоставляете. sizeof из void* - это всего лишь указатель на вашем компьютере (вероятно, 4/8 байт). Просто сохраните размер вместе с другими данными.

+0

ОК спасибо, я надеялся, что это возможно, звучит так, будто у вас есть лучшая работа вокруг решения, спасибо, и это было очень быстро ... вау. – hokkuk

Смежные вопросы