我在C++中遇到了一个新手问题.
我有一个结构Edge
定义如下:
struct Edge {
int position[4];
int average;
};
Run Code Online (Sandbox Code Playgroud)
现在我需要创建很多这些结构,并为此创建了一个辅助方法,它根据一些参数创建了这些结构的数组:
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;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我现在调用时:Edge *edges = createEdges(int some_parameters)
Edge数组中没有合理的数据(超出范围?).
我想我在这里混淆了一些东西,但我更愿意,如果我可以在不借助数据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;
}
}
Run Code Online (Sandbox Code Playgroud)
我没有看到我只是返回错误值(NULL)的原因是因为调试器向我展示了一些0xf6f6f6
带有负值的地址edge.position
(我不太明白的东西,它应该只是告诉我0x000000
,也许我是只想象事物).
总而言之,这是一个重要的教训,为什么在凌晨3点之后永远不会编码,没有什么好处的!
这是一个稍微修改过的版本,它在函数中创建边,并返回包含所有创建的边的向量。
#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;
}
Run Code Online (Sandbox Code Playgroud)
有一些修改: