2017-03-06 95 views
0

我有这样的结构:填充结构的阵列动态

struct Vertex { 
    Vertex(float px, float py, float pz, 
      float nx, float ny, float nz, 
      float tx, float ty) : position(px, py, pz), 
           normals(nx, ny, nz), 
           texCoords(tx, ty) {} 
    XMFLOAT3 position; 
    XMFLOAT3 normals; 
    XMFLOAT2 texCoords; 
}; 

,我需要填补该阵列与某些载体:

std::vector<XMFLOAT3> positions; 
std::vector<XMFLOAT3> normals; 
std::vector<XMFLOAT2> texCoords; 

阵列的长度由

给出
int numVertices; 

我想用向量填充struct Vertex的数组。我怎样才能做到这一点? 我试图初始化这样的数组:

Vertex points[numVertices]; 

但VAR没有一个恒定值。

谢谢你的帮助。

+0

为什么不能使用'std :: vector '? – mpiatek

+0

之后,我不得不使用'reinterpret_cast (点)'这需要数组而不是向量。 – Pino

+1

vector :: data()像一个原始数组(指向它的第一个元素的指针)。你可以用它来投射“BYTE *”或其他。 –

回答

1

std::vector是创建动态数组的最佳选择。

  1. 它为您处理内存管理。
  2. 您可以使用std::vector::data,std::vector::operator[],std::vector::iterator来访问阵列的内容。
  3. 您可以使用范围-循环处理std::vector的每个元素。

而不是

Vertex points[numVertices]; 

使用

std::vector<Vertex> points(numVertices); 
0

如果必须使用原始数组,你可以试试这个。假设XMFLOAT3,XMFLOAT2是一样的东西如下:

struct XMFLOAT3 { 
    XMFLOAT3(float x, float y, float z) : _x(x), _y(y), _z(z) {}; 
    float _x; 
    float _y; 
    float _z; 
}; 

struct XMFLOAT2 { 
    XMFLOAT2(float x, float y) : _x(x), _y(y) {}; 
    float _x; 
    float _y; 
}; 

限定INIT功能通过动态地分配和初始化元素作为初始化顶点数组:

Vertex ** 
initVertex(int numVertices) 
{ 
    Vertex **points = new Vertex *[numVertices]; 
    for (int i = 0; i < numVertices; ++i) { 
     points[i] = new Vertex(positions[i]._x, positions[i]._y, positions[i]._x, 
       normals[i]._x, normals[i]._y, normals[i]._z, 
       texCoords[i]._x, texCoords[i]._y); 
    } 
    return points; 
} 

可以使用Vertex **points = initVertex(numVertices)和取消引用的每个元素。

如果必须Vertex *points那么你可以使用这个函数来创建顶点的初始化数组:

Vertex * 
initVertex2(int numVertices) 
{ 
    char *points_buf = new char[sizeof(Vertex) * numVertices]; 
    Vertex *points = reinterpret_cast<Vertex *>(points_buf); 
    for (int i = 0; i < numVertices; ++i) { 
     new (points_buf + i * sizeof(Vertex)) 
       Vertex(positions[i]._x, positions[i]._y, positions[i]._x, 
       normals[i]._x, normals[i]._y, normals[i]._z, 
       texCoords[i]._x, texCoords[i]._y); 
    } 
    return points; 
} 

,并调用它Vertex *points = initVertex2(numVertices)和使用数组索引来访问每个元素。