在C 中创建结构数组
Creating array of structs in C++
我在C 中有一个新手问题。
我的结构Edge
定义为以下:
struct Edge {
int position[4];
int average;
};
现在,我需要创建很多这样的结构,并为此创建了一个辅助方法,该辅助方法基于某些参数创建了这些结构的数组:
Edge* createEdges(int some_parameters){
Edge *edges = new Edge[8];
for(int i = 0 ; i < 8; i++){
Edge edge;
edge.position[0] = 1; //fill the rest of the edge array in the same manner
edge.average = 10;
edges[i] = edge;
}
return edges;
}
但是,当我现在致电时:Edge *edges = createEdges(int some_parameters)
边缘数组中没有明智的数据(范围不超出?)。
我认为我在这里混合了一些东西,但是如果我可以在不求助于vector
数据架构的情况下进行此工作,我更喜欢。这是处理此操作的正常方式,还是我应该自己声明边缘数组并将其传递给助手方法以填充它?
编辑:
首先,我要感谢所有人的评论/提示/提示/建议/...他们帮助我找到了我很容易忽略的问题。
在看到代码应该起作用的答复后,我测试了简化的代码(我应该在第一名中做的事情),而且令人惊讶的是,它有效!因此,我检查了一下我的真实代码为什么不起作用而简化的版本也是如此。
我的真实代码看起来像这样:
Edge* createEdges(int some_parameters){
Edge* edges = new Edge[8];
if(some_parameter != 0){
//create the edges as in my 1st snippet
return NULL; //doh, should return edges here !
} else {
return NULL;
}
}
我没有看到我只是返回错误的值(null)的原因是因为调试器向我展示了一些0xf6f6f6
地址,其中有一些edge.position
的负值(我不太了解,它应该只是显示我0x000000
,也许我只是在想象)。
总的来说,这是一个重要的教训,为什么凌晨3点以后永远不要代码,没有什么好处!
它是C 使用std::vector
:
std::vector<Edge> createEdges(int some_parameters){
std::vector<Edge> edges;
for(int i = 0 ; i < 8; i++){
Edge edge;
edge.position[0] = 1;
edge.average = 10;
edges.push_back(edge);
}
return edges;
}
您在这里拥有的功能正常。我觉得您忘记的是,当您打电话
时Edge *edges = createEdges(int some_parameters)
边缘变量是指向列表中第一个元素的指针。如果您要这样做:
edges[0]
或:
edges[1]
您会看到这些值不同,现在您需要循环访问数组。请记住,您不会在循环期间通过阵列的末端。这就是为什么大多数人说使用向量的原因,因为您可以使用迭代器使用更多的安全功能。
欢迎来到C !用于创建类实例的辅助方法(C 中的结构是所有字段均为公共的类)称为构造函数。这是我将使用构造函数创建边缘类的实例。
class Edge {
public:
int position[4];
int average;
Edge();
};
Edge::Edge() //constructor
{
position[0] = 1;//fill the rest of the edge array in the same manner
average = 10;
}
int main()
{
Edge* myEdge = new Edge(); //constructor called
Edge* myEdges[8];
for (int i = 0; i < 8; i++)
{
myEdges[i] = new Edge();
}
return 0;
}
这是一个有点修改的版本,可以在函数中创建边缘,并返回包含所有创建边缘的向量。
#include <iostream>
#include <vector>
struct Edge {
int position[4];
int average;
};
std::vector< Edge > createEdges(int some_parameters){
std::vector< Edge > edges( 8 );
for(int i = 0 ; i < 8; i++){
const Edge edge{ { 1, 0, 0, 0 }, 10 };
edges[i] = edge;
}
return edges;
}
int main()
{
auto e( createEdges(5));
std::cout<<e[0].average<<std::endl;
}
几乎没有修改:
- 我没有分配一个边数和返回指针,而是返回向量
- 创建边缘对象的方式和初始化(我认为这是问的)
- C++将文本文件中的数据读取到结构数组中
- JSON转换为nlohmann JSON-lib中的结构数组
- 需要帮助将结构数组传递给函数
- 在 64 位边界上对齐C++结构数组?
- 带有枚举方向/类型的气泡排序结构数组
- 在C++中访问结构数组中的数据
- 从指向结构数组的指针中提取元素
- 如何制作一个地图,其中的值是C++中的结构数组
- 如何在函数中显示结构数组
- 包含作为成员C++函数的结构数组
- 如何修复函数中的 fstream 文件输入以将正确的信息存储在结构数组中?
- std::transform 将一个结构数组复制到另一个结构数组
- 将非托管结构数组封送到托管数组
- 显示结构数组
- 结构数组中所有类似字段的总和
- 结构数组的构造函数错误,错误消息:没有构造函数实例与参数列表匹配
- 在 glsl opengl 中将嵌套结构数组作为统一传递
- 使用初始化列表填充C++中的多维结构数组时出现问题
- 如何将字符串字符与结构数组进行比较?
- C++结构数组