C++ 在单独的函数中从结构检索数组成员

C++ 在单独的函数中从结构检索数组成员,c++,arrays,struct,C++,Arrays,Struct,我在从结构检索某些值时遇到问题。在下面的简化代码段中,结构模型的顶点成员包含一个值数组,如果调用buildModel()并在其中调用drawModel(),则可以正确检索该数组。但是,如果我调用buildModel(),然后调用drawModel(),则不会出现错误,但不会使用正确的值检索顶点。这使我相信要么变量作用域结束,要么我错误地传递了引用,要么顶点成员需要用malloc在堆上定义 型号H: typedef struct Model{ Vertex *vertices; } Mode

我在从结构检索某些值时遇到问题。在下面的简化代码段中,结构模型的顶点成员包含一个值数组,如果调用buildModel()并在其中调用drawModel(),则可以正确检索该数组。但是,如果我调用buildModel(),然后调用drawModel(),则不会出现错误,但不会使用正确的值检索顶点。这使我相信要么变量作用域结束,要么我错误地传递了引用,要么顶点成员需要用malloc在堆上定义

型号H:

typedef struct Model{
   Vertex *vertices;
} Model;

Model* newModel();

Model* setVertices(Vertex *vertices, Model *model);
MODEL.CPP:

Model* newModel(){
   Model* model;
   model = (Model* )malloc(sizeof(Model));
   //model->vertices = (Vertex *)malloc(sizeof(Vertex)); This did not help...

   return model;
}

Model* setVertices(Vertex *vertices, Model *model){
   model->vertices = vertices;

   return model;
}
DRAWING.CPP:

Model* buildModel(){
   Model* model = newModel();

   Vertex vertices[] = {
      { XMFLOAT3(-1.0f, 5.0f, -1.0f), (XMFLOAT4)colorX},
      ...  //Abbreviated declaration
   };

   model = setVertices(vertices, model);

   //drawModel(model);    Calling drawModel() here retrieves vertices correctly

   return model;
}

void drawModel(Model *model){
   loadVertices(d3dDeviceRef, 11, model->vertices); //Trying to pass vertices array here
}
<>这在学习中非常有用,我尽量少用类,在C++时比C走更多的路径。

任何帮助都将不胜感激


谢谢。

顶点
数组是
buildModel
函数的本地数组。函数一返回,数组就消失了

这相当于,只是稍微复杂一点


我建议使用C++方式,使用一个<代码> STD::vector < /代码>代替一组指针。

< P> >代码>顶点< /C>数组是本地的代码>函数一返回,数组就消失了

这相当于,只是稍微复杂一点


我建议C++方式,使用一个代码> STD::vector < /COD>而不是一组指针。

< p>你必须添加到你的代码>结构模型< /Cord>一个代码> int >代码>来存储顶点的数量,并在程序的其余部分考虑到:

typedef struct Model{
   Vertex *vertices;
   int nVertices; // add this
} Model;
然后您必须在
newModel()
中分配内存,如下所示:

model = (Model* )malloc(nVertices*sizeof(Vertex)+sizeof(int)); // this will allocate the necessary space 
(此时,必须定义顶点数)

然后使用
memset()
将分配的内存设置为零(如果需要)

然后添加到
setVertices()
一个新的
int
参数,用于发送顶点数并设置
模型->nEntices

您必须在
结构模型中添加一个
int
来存储顶点数,并在程序的其余部分将其考虑在内:

typedef struct Model{
   Vertex *vertices;
   int nVertices; // add this
} Model;
然后您必须在
newModel()
中分配内存,如下所示:

model = (Model* )malloc(nVertices*sizeof(Vertex)+sizeof(int)); // this will allocate the necessary space 
(此时,必须定义顶点数)

然后使用
memset()
将分配的内存设置为零(如果需要)

然后添加到
setVertices()一个新的<代码> int >代码>参数,发送顶点的数目,并设置<代码>模型> ngReals>代码> > ./p>如果你想“走C路线”,请使用C,而不是C++。否则,请使用语言提供的功能。无论如何,这是C++,所以不要使用C标签。C和C++是不同的语言,并且没有显示数组成员。指针不是数组,反之亦然@Olaf不久将再次尝试使用C,Visual Studio基于我使用的一些库阻止我使用它。同时,C语言的一些解决方案也可以在C++中工作。像David Heffernan的答案[1](),代码< MalCal可以在C++中使用,但是代码< >新< /代码>。完全同意采取一种语言认真,仍然学习,即使从你的评论。不要编译C代码与C++编译器!C已经进化了很多,就像C++一样。请注意,C表示至少C99,但实际上是标准C,它只是C11(没有多个C标准)。即使对于相同的语法和语法,某些语义也会有细微的差异,但差异显著。这两种语言的公共子集太小,无法用任何语言编写良好的非平凡代码。概括的个人提示:如果学生或同事为了兼容性而牺牲了提高代码质量的语言功能,我会拒绝任何代码。@Olaf半兼容代码是个坏主意,但有一天我打算用所学的重新编写。不要仅仅使用上面的个人应用,把同事或老师作为用户是一个很好的想法。如果你想“走C路线”,使用C,而不是C++。否则,请使用语言提供的功能。无论如何,这是C++,所以不要使用C标签。C和C++是不同的语言,并且没有显示数组成员。指针不是数组,反之亦然@Olaf不久将再次尝试使用C,Visual Studio基于我使用的一些库阻止我使用它。同时,C语言的一些解决方案也可以在C++中工作。像David Heffernan的答案[1](),代码< MalCal可以在C++中使用,但是代码< >新< /代码>。完全同意采取一种语言认真,仍然学习,即使从你的评论。不要编译C代码与C++编译器!C已经进化了很多,就像C++一样。请注意,C表示至少C99,但实际上是标准C,它只是C11(没有多个C标准)。即使对于相同的语法和语法,某些语义也会有细微的差异,但差异显著。这两种语言的公共子集太小,无法用任何语言编写良好的非平凡代码。概括的个人提示:如果学生或同事为了兼容性而牺牲了提高代码质量的语言功能,我会拒绝任何代码。@Olaf半兼容代码是个坏主意,但有一天我打算用所学的重新编写。与其将上述内容用于个人用途,还不如让同事或老师作为用户保持正确的视角。顶点数组的消失是有意义的。因此,我将尝试对模型使用std::vector,并查看顶点是否保持完整。还将尝试在堆上正确声明顶点,如您包含的“返回指向局部变量的指针”链接中所述。非常感谢通过调试指针的地址来跟踪指针。有很多语言概念需要解决,但感谢您指出范围问题。这项工作正在进行中,需要买一本书