2014-01-12 38 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的過程。你的循環中有大量的內存覆蓋。