2014-01-12 24 views
-1

问题而试图将数据存储在结构堆分配错误

我想几个立方体的位置,正常和颜色存储到一个结构,并存储其中他们应该被绘制的指数,在载体中。但是我的做法触发了错误malloc.c

我在做什么

我加载立方体的位置,从一个文件中的多维数据集的颜色沿着:

vector<vec3> cp; // size 51 
vector<vec3> cc; // size 51 
readLevelFile("levelfile.txt", cp, cc); 

我用对象加载器加载立方体的数据:

vector<vec3> vertexPositions; // size 24 
vector<int> indices; // size 36 
vector<int> outIndices; // empty 
vector<vec3> normals; // size 24 
vector<vec2> uvs; // unused 
loadObject("cube_with_normals.obj", vertexPositions, indices, normals, uvs, 10.0f); 

然后我创建一个新的结构和创建者的一个实例:

struct Vertex { 
    vec3 position; 
    vec3 normal; 
    vec3 color; 
    vec2 texture; 
}; 
Vertex *cubeData = new Vertex; 

然后再遍历立方体的位置数:

for (int j = 0; j < cp.size()*vertexPositions.size(); j+=vertexPositions.size()) { 

    for (int i = 0; i < vertexPositions.size(); i++) 
    { 
     cubeData[j+i].position = vertexPositions[i]+cc[j/vertexPositions.size()]; 
     cubeData[j+i].normal = normals[i]; 
     cubeData[j+i].color = cc[j/vertexPositions.size()]; 

    } 

    for (int i=0; i < indices.size();i++) 
    { 
     outIndices.push_back(indices[i]+indices.size()*(j/vertexPositions.size())); 
    } 

} 

然而,这触发malloc.c断点

编辑: 最终我希望数据看起来像这样:

Vertex groundData[] = { 
    { vec3(-1000.0,ypos,1000.0), vec3(0.0f, 1.0f, 0.0f), color, vec2(0.0f, 0.0f) }, 
    { vec3(-1000.0,ypos,-1000.0), vec3(0.0f, 1.0f, 0.0f), color, vec2(0.0f, 1.0f) }, 
    { vec3(1000.0,ypos,-1000.0), vec3(0.0f, 1.0f, 0.0f), color, vec2(1.0f, 1.0f) }, 
    { vec3(1000.0,ypos,1000.0),  vec3(0.0f, 1.0f, 0.0f), color, vec2(1.0f, 0.0f) } 
}; 

这简化在缓冲器中存储所述数据

+1

那究竟如何的内容一个向量看起来像。正如我在评论/回答中所说的,只需调用'std :: vector :: data()'成员函数来检索基础数组。 – Manu343726

+0

@ Manu343726:除非您认为这是关于C++ 11的问题,否则'std :: vector'没有'data(...)'成员函数。我会建议使用'&vector [0]'来代替,它更便于携带。 –

+2

谁低估了我的问题:小心解释,这样我就不会再犯同样的错误了吗? – Attaque

回答

1
Vertex *cubeData = new Vertex; 

仅分配一个Vertex。如果你wan't分配数组,你必须使用new[]操作:

Vertex *cubeData = new Vertex[cp.size()*vertexPositions.size()*vertexPositions.size()]; 

但是,为什么你动态地分配数据,如果你知道如何使用std::vector,管理自动将其大小和内存?

std::vector<Vertex> cubeData; 

for (int j = 0; j < cp.size()*vertexPositions.size(); j+=vertexPositions.size()) { 

    for (int i = 0; i < vertexPositions.size(); i++) 
    { 
     cubeData.emplace_back(); 

     cubeData[j+i] vertexPositions[i]+cc[j/vertexPositions.size()]; 
     cubeData[j+i].normal = normals[i]; 
     cubeData[j+i].color = cc[j/vertexPositions.size()]; 

    } 

    for (int i=0; i < indices.size();i++) 
    { 
     outIndices.push_back(indices[i]+indices.size()*(j/vertexPositions.size())); 
    } 
} 

如果您的函数期望的阵列,而不是载体,就没有问题,std::vector有一个成员函数data()它返回一个指针为基础数组:

void f(Vertex* array_of_vertex); 

int main() 
{ 
    std::vector<Vertex> cubeData; 

    //.... 

    f(cubeData.data()); //Tah dah! 
} 
+0

我想这样做,因为我稍后调用一个将数据加载到顶点缓冲区的函数。所以我希望结构像顶点结构一样。 – Attaque

+0

@Attaque如果你以后需要向量的底层数组,只需调用它的['data()'](http://en.cppreference.com/w/cpp/container/vector/data)成员即可。 – Manu343726

+0

啊,我明白了!我认为它现在可能正在工作,但是我对立方体的定位是错误的。我会尝试修复 – Attaque

0

大概是因为你只分配一个Vertex对象cubeData的过程。你的循环中有大量的内存覆盖。