2012-03-05 4 views
0

Если у меня есть место в памяти чего-либо, хранящегося в целочисленном размере, как я могу получить объект, хранящийся в памяти?Как получить объект в ячейке памяти?

Как мне нужно использовать это:

#include <stdio.h> 
#include "CelGL.h" 

/* 
Stride: The size of the data structure containing the per-vertex data 
Offset: Offset within the structure to find this data 
*/ 

// Example structs that store the data 
typedef struct { 
    float x; 
    float y; 
    float z; 
} Vertex; 

typedef struct { 
    float x; 
    float y; 
    float z; 
} Normal; 

typedef struct { 
    float r; 
    float g; 
    float b; 
} Color; 

// Info for rendering 
typedef struct { 
    int vertex; 
    int vertexStride; 
    int vertexOffset; 
    int normal; 
    int normalStride; 
    int normalOffset; 
    int index; 
} RenderData; 


RenderData _renderData; 
int _buffer; // Memory location of array with data 

// sets the integer to the memory location of the data 
void celBindBuffer(int *buffer) 
{ 
    _buffer = &buffer; // Alert:Incompatible pointer to integer conversion assigning to 'int' from 'int **' 
} 

void celVertexAttribPointer(CelVertexAttrib attrib, int stride/*bytes*/, int offset/*bytes*/) 
{ 
    switch (attrib) { 
     case CelVertexAttribPosition: 
      _renderData.vertex = _buffer; 
      _renderData.vertexStride = stride; 
      _renderData.vertexOffset = offset; 
      break; 
     case CelVertexAttribNormal: 
      _renderData.normal = _buffer; 
      _renderData.normalStride = stride; 
      _renderData.normalOffset = offset; 
     default: 
      break; 
    } 
} 

void printVertex(Vertex v) 
{ 
    printf("Vertex[%f,%f,%f]\n", v.x, v.y, v.z); 
} 

void testPrint(int size/*size in bytes*/) 
{ 
    for (int i = 0; i < size; i++) { 
     // Gets the initial location of the data in which it is stored, gets the size of the struct and multiplies it by the index and then offsets to the 
     Vertex v = (Vertex)(_renderData.vertex + i * _renderData.vertexStride + _renderData.vertexOffset); // How can I do this? 
     printVertex(v); 
    } 
} 

Как я должен получить объект в этом месте, и почему я получаю предупреждение в _buffer = &buffer;?

EDIT: Переменная буфер представляет собой массив структур, а не только одно значение, поэтому мне нужно, чтобы иметь место в памяти его. Как только я получу это, как я могу получить объект в этом месте (строка: Vertex v = (Vertex)(_renderData.vertex + i * _renderData.vertexStride + _renderData.vertexOffset);)?

EDIT: Так, чтобы получить расположение данных я бы использовать _buffer = & (* буфер) ;?

РЕДАКТИРОВАТЬ информация передается на метод:

typedef struct { 
    Vertex position; 
    Normal normal; 
} VertexData; 

static const VertexData mesh[] = { 
    {/*v:*/{-0.000000, -1.125000, 0.000000}, /*n:*/{0.059877, -0.998169, 0.007874} }, 
    {/*v:*/{-0.000000, -0.986528, -0.475087}, /*n:*/{0.114078, -0.863674, -0.490890} }, 
    {/*v:*/{0.357184, -0.948670, -0.284845}, /*n:*/{0.427045, -0.850368, -0.307321} }, 
    {/*v:*/{-0.000000, -1.125000, 0.000000}, /*n:*/{0.059877, -0.998169, 0.007874} }, 
    {/*v:*/{0.357184, -0.948670, -0.284845}, /*n:*/{0.427045, -0.850368, -0.307321} }, 
    {/*v:*/{0.449795, -0.958029, 0.102663}, /*n:*/{0.477462, -0.877438, 0.045442} }, 
    {/*v:*/{-0.000000, -1.125000, 0.000000}, /*n:*/{0.059877, -0.998169, 0.007874} }, 
    {/*v:*/{0.449795, -0.958029, 0.102663}, /*n:*/{0.477462, -0.877438, 0.045442} }, 
     ... 
}; 

void render() { 
    celBindBuffer(mesh); 
    celVertexAttribPointer(CelVertexAttribPosition, sizeof(VertexData), offsetof(VertexData, position)); 
    testPrint(sizeof(mesh)/sizeof(VertexData)); 
} 
+0

Могу ли я спросить, почему вы объявили '_buffer' и' Renderdata.vertex' как 'int' вместо' int * '? – tia

+0

@tia: Потому что я не хочу иметь обычный указатель. Мне нужно сохранить местоположение байта данных в памяти, чтобы я мог вручную управлять количеством измененных байтов. Например, если у меня есть указатель на массив int, тогда указатель + 1 = указатель + 3 байта. Если у меня есть int, который сохраняет ячейку памяти, тогда указатель + 1 = указатель + 1 байт. –

+0

Итак, как насчет использования 'char *' или 'void *' вместо этого? – tia

ответ

2

Указатель (int *buffer) представляет собой переменную, которая содержит адрес памяти. Чтение памяти по адресу, указанному указателем, называется разыменованием указателя. То, что вы делаете, фактически принимает адрес самого указателя. Таким образом, вместо этого:

_buffer = &buffer;

.. вы должны разыменования указателя для считывания значения, на который указывает указатель этой buffer:

_buffer = *buffer;

Я рекомендую вам прочитать статью Pointer Basics, его может помочь вам немного обернуть голову вокруг этих вещей.

Надеюсь, это поможет. Удачи!

UPDATE:

В вашем случае, вы лучше иметь указатель того же типа, что и объект, который передается в .. В противном случае это довольно много запутанной. Ниже приведен пример работы с этим указателем:

#include <stdio.h> 

typedef struct { 
    double x; 
    double y; 
    double z; 
} Vertex; /* Just to make a simple code compile.. */ 
typedef Vertex Normal; /* Same story... */ 

typedef struct { 
    Vertex position; 
    Normal normal; 
} VertexData; 

static const VertexData mesh[] = { 
    { {-0.000000, -1.125000, 0.000000}, {0.059877, -0.998169, 0.007874} }, 
    { {-0.000000, -0.986528, -0.475087}, {0.114078, -0.863674, -0.490890} }, 
    { {0.357184, -0.948670, -0.284845}, {0.427045, -0.850368, -0.307321} }, 
    { {-0.000000, -1.125000, 0.000000}, {0.059877, -0.998169, 0.007874} }, 
    { {0.357184, -0.948670, -0.284845}, {0.427045, -0.850368, -0.307321} }, 
    { {0.449795, -0.958029, 0.102663}, {0.477462, -0.877438, 0.045442} }, 
    { {-0.000000, -1.125000, 0.000000}, {0.059877, -0.998169, 0.007874} }, 
    { {0.449795, -0.958029, 0.102663}, {0.477462, -0.877438, 0.045442} } 
}; 

void celBindBuffer(const VertexData *data) 
{ 
    const Vertex *v0 = &data[0].position; 
    const Normal *n0 = &data[0].normal; 

    const Vertex *v1 = &data[1].position; 
    const Normal *n1 = &data[1].normal; 

    printf("Vertex#1: %f/%f/%f...\n", v0->x, v0->y, v0->z); 
    printf("Vertex#2: %f/%f/%f...\n", v1->x, v1->y, v1->z); 
} 

int main(void) 
{ 
    celBindBuffer(mesh); 
    return 0; 
} 

Как вы можете видеть, немного pointer arithmetics делает работу. Однако есть немного проблемы с вашей функцией - вы пытаетесь передать массив объектов VertexData. Но проблема в том, что функция celBindBuffer() не знает, сколько элементов в этом массиве ... Вы должны передать число этой функции, чтобы указать, сколько элементов в векторе. В противном случае вы можете легко запустить в undefined behavior.

+0

Переменный буфер - это массив структур, а не только одно значение, поэтому мне нужно иметь его расположение в памяти. Как только я это получу, как я могу получить объект в этом месте (строка: Vertex v = (Vertex) (_ renderData.vertex + i * _renderData.vertexStride + _renderData.vertexOffset);)? –

+0

Итак, чтобы получить местоположение данных, я буду использовать _buffer = & (* buffer) ;? –

+0

Стас, трудно ответить на ваш вопрос, не видя, что именно передается этой функции 'celBindBuffer'. Но дело в том, что переменная' buffer' является местоположением данных. Чтобы получить его, вам не нужно ничего делать. Если вы хотите читать значения оттуда - вы можете разыгрывать их до тех пор, пока это тип POD, и даже использовать арифметику указателя для перемещения по нескольким элементам, указанным «buffer». В противном случае вы можете использовать 'memcpy' для копирования областей памяти. Я думаю ... вам нужно уточнить, что вы задаете вопрос, чтобы получить лучший ответ ... –

0

Линия

_buffer = &buffer; 

пытается присвоить адрес переменной buffer (что случается быть указателем) в целочисленную переменную _buffer. Другими словами, он присваивает тип «указатель на указатель» в целочисленную переменную.(Оператор & означает «адрес».) Вы, вероятно, хотите

_buffer = *buffer; 

задающего содержимое по адресу в buffer (который будет целое число) до целого числа _buffer. Оператор * означает «содержимое по этому адресу».