在c ++

时间:2015-07-17 13:56:52

标签: c++ pointers

我坚持创建一个函数,它应该返回一个包含指针指针的结构。问题是我无法访问数据:/

问题是:

struct openGLmodel
{

    struct subM
    {

        Vec3*      positions;
        Vec3*      normals;

        int        nbrVertices;

        int        nbrTriangles;
        int*       triangleIndices;
    };

    dim_type  subModelCount;
    subM*     subModel;
}

该函数正在通过以下方式构建模型:

openGLmodel createModel(..model data)
{

openGLmodel model;

std::vector<openGLmodel::subM>* subModels = new std::vector<openGLmodel::subM>; 

std::vector<Vec3>* positions = new std::vector<Vec3>;
std::vector<Vec3>* normals = new std::vector<Vec3>;

int subModelIndex = 0;

for(...all vertices...)
{
    ... //extracting positions and normal vectors

    positions->push_back(pos);
    normals->push_back(normal);

    if(positions->size() >= 65536)
    {
        subModels->push_back(openGLmodel::subM());

        subModels->at(subModelIndex).positions = positions->data();
        subModels->at(subModelIndex).normals = normals->data();


        std::vector<Vec3>* positions = new std::vector<Vec3>;
        std::vector<Vec3>* normals = new std::vector<Vec3>;

        subModelIndex++;
    }
}

...
... 


model.subModel = new openGLmodel::subM[subModelIndex]();

for(int i=0; i<subModelIndex; i++)
{
    model.subModel[i] = openGLmodel::subM();

    model.subModel[i].positions = subModels->data()[i].positions;
    model.subModel[i].normals = subModels->data()[i].normals;

}

return model;

}

subModels包含正确的数据,但model.subModel不包含。如何让模型访问向量中的数据?在最后一个for循环中似乎是错误的。

1 个答案:

答案 0 :(得分:0)

您访问的原因:

 model.subModel[i]

当它只是类型:

subM*     subModel;

你正在访问不应该被访问的内存。

另一方面,您的代码过于复杂且危险。 你可以削减你实际上并不需要的大部分指针。

std::vector<openGLmodel::subM>* subModels = new std::vector<openGLmodel::subM>; 

std::vector<Vec3>* positions = new std::vector<Vec3>;
std::vector<Vec3>* normals = new std::vector<Vec3>;

变为

std::vector<openGLmodel::subM> subModels;    
std::vector<Vec3> positions;
std::vector<Vec3> normals;

和你的结构

struct openGLmodel
{

    struct subM
    {

        Vec3 positions;
        Vec3 normals;
        int  nbrVertices;

        int        nbrTriangles;
        std::vector<int> triangleIndices;
    };

    dim_type  subModelCount;
    subM*     subModel;
}

如果您需要重用现有的向量而不是复制它们,您可以使用对向量的引用并在构造函数的初始化列表中初始化它。