Код: Выделить всё
...
type *ptr;
type* function1(){
std::vector vector;
return vector.data();
}
ptr = function1();
// ptr points to corrupt data here
...
Код: Выделить всё
...
std::vector vect;
void function1(std::vector &vector){
// Add data to vector
}
// Use the data inside vector
type *ptr = vect.data();
...
Контекст контекста : я пишу этот двигатель, где я храню позицию, нормальную, вершину и индексы в классе сетки. Я использую динамические массивы необходимых типов OpenGL, точно так же: < /p>
Код: Выделить всё
class Mesh(){
...
GLfloat *vertices;
GLubyte *indices;
...
}
< /code>
Я разработал куб с ручкой и бумагой, с его вершинами, координатами текстуры, нормами и индексами, а затем заполнил мои динамические массивы этими данными (скопировал их вручную :: Скопируйте его в динамические массивы после правильного распределения памяти (используя новый BTW). Это работало как чар....
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
...
glVertexPointer(3, GL_FLOAT, 0, meshInst->pos_coords);
glTexCoordPointer(2, GL_FLOAT, 0, meshInst->tex_coords);
...
glDrawElements(
GL_TRIANGLES, (CORRECT index count), GL_UNSIGNED_BYTE,
meshInst->indices
);
...
I created another constructor for Mesh, which instead of copying the data to newly allocated memory from an array of GLfloat, GLubyte, etc. (which worked like a charm I might repeat), it does the following:
1)Loads data (which was Тщательно протестированные для правильного импорта ) из файла в std :: vector положения , std :: vector ind и т. Д.
2) Я попробовал два способа передачи данных в мои динамические массивы, чтобы быть выброшенными на OpenGL, способ и путь b:
способ a: < /strong> < /p>
Код: Выделить всё
std::copy(positions.begin(), positions.end(), vertices);
std::copy(inds.begin(), inds.end(), indices);
< /code>
Результат: < /strong> работает отлично, как в первом конструкторе
print: < /strong> < /p>
P[72] = { 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1 }
I[36] = { 0, 1, 2, 3, 2, 1, 6, 4, 7, 5, 7, 4, 10, 8, 9, 11, 9, 8, 13, 12, 15, 14, 15, 12, 17, 16, 19, 18, 19, 16, 23, 20, 21, 22, 21, 20 }
< /code>
way b: < /strong> < /p>
vertices = positions.data();
indices = inds.data();
I[36] = { 0, 1, 2, 3, 2, 1, 6, 4, 7, 5, 7, 4, 10, 8, 9, 11, 9, 8, 13, 12, 15, 14, 15, 12, 17, 16, 19, 18, 19, 16, 23, 20, 21, 22, 21, 20 }
< /code>
Вопрос в том ... почему? Как указано в http://www.cplusplus.com/reference/vector/vector/data/. Кроме того, если я сравню данные, указанные «вершинами» и «индексами», это буквально идентично. Сравните оба отпечатки данных для себя. Они оба напечатаны с использованием хранимой длины и динамическими указателями массива сразу после загрузки.>
Подробнее здесь: https://stackoverflow.com/questions/363 ... -corrupt-d