【问题标题】:Retrieve array member from struct in separate function在单独的函数中从结构中检索数组成员
【发布时间】:2016-01-19 15:49:01
【问题描述】:

我无法从结构中检索某些值。在下面简化的 sn-ps 中,struct Model 的 vertices 成员包含一个值数组,如果在其中调用 buildModel() 并在其中调用 drawModel(),则可以正确检索这些值。但是,如果我随后调用 buildModel() 然后调用 drawModel() ,则不会出现错误,但不会使用正确的值检索顶点。这使我相信变量范围已结束,我错误地传递了引用,或者需要使用 malloc 在堆上定义顶点成员。

型号.H:

typedef struct Model{
   Vertex *vertices;
} Model;

Model* newModel();

Model* setVertices(Vertex *vertices, 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;
}

绘图.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++。

任何帮助将不胜感激,

谢谢。

【问题讨论】:

  • 如果您想“走 C 路线”,请使用 C,而不是 C++。否则使用语言提供的功能。无论如何,这是 C++,所以不要使用 C 标签。 C 和 C++ 是不同的语言。
  • 并且没有显示数组成员。指针不是数组,反之亦然!
  • @Olaf 将很快再次尝试使用 C,Visual Studio 阻止我使用它基于我正在使用的一些库。同时,似乎一些 C 解决方案也可以在 C++ 中运行。就像 David Heffernan 的回答 [这里] (stackoverflow.com/a/8224387/1914293) 说 malloc 可以在 C++ 中使用,但 new 是预期的。完全同意认真对待一门语言,但仍在学习,即使是从你的 cmets 那里学习。
  • 不要使用 C++ 编译器编译 C 代码! C 已经发展了很多,C++ 也是如此。请注意,C 至少表示 C99,但实际上是标准 C,即 C11(没有多个 C 标准)。即使对于相同的语法和语法,一些语义也有细微的差别,但意义重大。两种语言的共同子集太小,无法用任何语言编写好的非平凡代码。一个概括的个人说明:我会拒绝学生或同事的任何代码,这些代码为了兼容性而牺牲了提高代码质量的语言功能。
  • @Olaf 半兼容代码是个坏主意,但打算用我有一天学到的东西重写。将以上内容仅用于个人用途,将同事或老师作为用户保持观点是一个绝妙的主意。

标签: c++ arrays struct


【解决方案1】:

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

这相当于returning a pointer to a local variable,只是稍微复杂一点。

我会推荐 C++ 方式,并使用 std::vector 而不是一堆指针。

【讨论】:

  • 顶点数组消失是有道理的。因此,我将尝试对模型使用 std::vector 并查看顶点是否保持完整。还将尝试在您包含的“返回指向局部变量的指针”链接中正确声明堆上的顶点。赞赏
  • 通过调试它们的地址来跟踪这里的指针。许多语言概念需要解决,但感谢您指出范围问题。为这项工作分离了函数,最终需要买一本书,所以我停止学习malloc,memcpy,寻址原理。我不喜欢我声明顶点数组的方式,所以最终会从文件中读取。
【解决方案2】:

您必须添加到您的 struct Modelint 以存储顶点数并在程序的其余部分中考虑到它:

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 参数以发送顶点数并使用它设置model->nVertices

【讨论】:

  • 您使用的 malloc 样式解决了我脑后的一些大小问题。谢谢。
  • 现在可以运行了。不确定这里的最佳实践,但会坚持使用 malloc'ing sizeof(Model) 和 malloc 分开的成员。然后我可以使用模型,让它的成员成为指针,并从其他函数中分配它的顶点。这有帮助,所以将此答案标记为“向上”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
  • 1970-01-01
  • 2013-06-19
相关资源
最近更新 更多