我正在使用Kruskal算法实现迷宫生成。我已经完成了除最后一步之外的所有事情,它将我的浮动对矢量(矢量>)转换为Vector2f(矢量)的矢量。这是我用来做这个的功能:
void ConvertToVector2F(vector<std::pair<float, float>> verts, vector<Vector2f> verts2f)
{
//convert verts vector of pairs to vector of vector2f (MS stuff)
for (int i = 0; i < verts.size(); i++)
{
Vector2f newVert = { verts[i].first, verts[i].second };
verts2f.push_back(newVert);
}
}
这是从main函数调用的,转换后,从main函数返回Vector2f对象的向量。当我从main返回verts2f时,会导致一系列错误:
“Lab1.exe中0x76EFC42D处的未处理异常:Microsoft C ++ 异常:内存位置为0x0025EDF8的std :: out_of_range。“
“运行时检查失败#0 - 未正确保存ESP的值 跨函数调用。这通常是调用a的结果 用一个带有函数指针的调用约定声明的函数 用不同的调用约定声明。“
“运行时检查失败#0 - 未正确保存ESP的值 跨函数调用。这通常是调用a的结果 用一个带有函数指针的调用约定声明的函数 用不同的调用约定声明。“
这些不会导致整个功能崩溃,但迷宫生成不起作用。
当我传递vector2fs的泛型向量时,例如{ {0,0} }
,不会发生错误。
我怀疑这是我处理矢量对象的问题,特别是因为我提到的错误都提到了一些关于
的问题的std ::矢量&lt; float,std :: allocator&gt; * object。
我真的不知道如何解决这个问题。我只知道造成这个问题的原因。
任何人都可以解释这个问题吗?我在Windows 7 x64计算机上使用Visual Studio 2013编写。
答案 0 :(得分:2)
将函数声明为
void ConvertToVector2F(vector<std::pair<float, float>> verts,
vector<Vector2f> &verts2f);
这是将第二个参数声明为对向量的引用。
至于我,那么我会将该函数声明为
void ConvertToVector2F( const vector<std::pair<float, float>> &verts,
vector<Vector2f> &verts2f);
答案 1 :(得分:1)
您需要执行按引用传递以获取verts2f
内的修改后的main
void ConvertToVector2F(vector<std::pair<float, float>> verts,
vector<Vector2f> &verts2f);
这也是理想的方法,因为它可以避免昂贵的复制参数。这会更好:
void ConvertToVector2F(vector<std::pair<float, float>> &verts,
vector<Vector2f> &verts2f);
现在只将两个向量的起始地址作为参数传递。