Как получить объект в ячейке памяти? - PullRequest
0 голосов
/ 05 марта 2012

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

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

#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;?

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

РЕДАКТИРОВАТЬ: Поэтому, чтобы получить местоположение данных, я бы использовал _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));
}

Ответы [ 2 ]

2 голосов
/ 05 марта 2012

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

_buffer = &buffer;

.. вам нужно разыменовать указатель, чтобы прочитать значение, указанное этим указателем buffer:

_buffer = *buffer;

Я рекомендую вам прочитать статью Основы указателя , она поможет вам немного обдумать эти вещи.

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

ОБНОВЛЕНИЕ:

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

#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;
}

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

0 голосов
/ 05 марта 2012

Строка

_buffer = &buffer;

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

_buffer = *buffer;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...