Добавить элемент в массив указателей - PullRequest
0 голосов
/ 30 июля 2011

У меня есть массив указателей пользовательского Vector typedef (всего 3 числа с плавающей запятой). Я пишу загрузчик объектов Wavefront и хочу иметь возможность добавлять в массив этих векторов всякий раз, когда встречается строка вершин в файле. Моя проблема на данный момент - выделение памяти для нового вектора.

Вектор

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

Разбор строки и сохранение в памяти

Vector *verticies;

Vector tmp;
verticies = new Vector;

long endPtr = sizeof(verticies);

sscanf(line, "v %f %f %f", &verticies[endPtr].x, &verticies[endPtr].y, &verticies[endPtr].z);

return;

В файле .obj имеется восемь вершин, и вывод sizeof(verticies) постоянно показывает 8. Проблема с кодом выше в том, что новая вершина дана последнему элементу в *verticies, поэтому мой вопрос таков; ** Как мне динамически добавлять элементы в конец массива указателей? **

Ответы [ 4 ]

1 голос
/ 30 июля 2011
Vector *verticies;
verticies = new Vector;

Прежде всего, verticies не является массивом указателей типа Vector. Это просто указатель на Vector. Поэтому, когда вы создаете экземпляр, vecticies указывает на него. Оставляя последний экземпляр, на который он указывал, вызывая утечку памяти. Если вам нужен массив указателей, то это будет -

Vector *verticies[constant];

Поскольку вы пометили C ++, std::vector подходит для вашей программы.

std::vector <Vector> verticies ;

Теперь выполните операцию push_back для каждого создаваемого вами экземпляра.

1 голос
/ 30 июля 2011
sizeof(verticies);

всегда дает 8, потому что это указатель, размер указателя в вашей среде равен 8.

Это не значит, что у вас 8 вершин.

Если вы хотите массивVector of 8 items, вам нужно сделать:

Vector verticies[8];

Если вы не знаете, сколько Vector элементов вам нужно использовать во время компиляции,
std::vctor.

1 голос
/ 30 июля 2011

Вы должны использовать std::vector для этого.(Или какой-то другой стандартный контейнер.)

Ничто в вашем коде не содержит массив указателей.Все, что у вас есть, это указатель на один Vector элемент, который вы создали с помощью new Vector.

sizeof(vertices), даст вам размер vertices, то есть Vector*.Так что sizeof(vertices) всегда будет возвращать любой размер указателя на вашей платформе.

1 голос
/ 30 июля 2011

Вы выделяете место только для одной Vector структуры.

sizeof(vertices) будет размером указателя на вашей машине и здесь абсолютно бессмысленен.

sscanf(line, "v %f %f %f", &(verticies->x), &(verticies->y), &(verticies->z));

собирается делать то, что вам нужно.Но это только позволяет вам читать в одном Vector.Вам нужно либо выделить достаточно места (столько векторов, сколько у вас есть строк) и использовать цикл for, чтобы сопоставить строку со смещением в массиве.

Но вы действительно должны использовать std::vector иstd::ofstream.

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