2014-09-21 70 views
1

我正在使用Kruskal算法实现迷宫生成。除了最后一步之外,我已经完成了所有的工作,将我的成对的浮点数(vector>)转换为Vector2f(vector)的矢量。下面是我用来做这个功能:从pair到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函数调用,并转换后,从主函数返回Vector2f物体的向量。当我从主verts2f返回,它会导致一系列的错误:

“未处理的Lab1.exe在0x76EFC42D例外:微软C++ 异常:内存位置0x0025EDF8的std :: out_of_range。”

“运行时检查失败#0 - ESP的值未正确保存 跨越函数调用这通常是调用具有与一个声明的函数指针 一个调用约定声明的 函数的结果不同的召唤习惯“。

“运行时检查失败#0 - ESP的值未正确保存 跨越函数调用这通常是调用具有与一个声明的函数指针 一个调用约定声明的 函数的结果不同的召唤习惯“。

这些不会导致整个功能崩溃,但迷宫代不起作用。

当我传递vector2fs的通用向量(如{ {0,0} })时,不会发生错误。

我怀疑这是我如何处理矢量对象,特别是因为我提到的所有错误提到一些有关的

的std ::矢量浮点<,性病::分配器> *对象的问题。

我不知道该怎么做才能解决问题。我只知道是什么导致了这个问题。

任何人都可以解释这个问题?我正在使用Windows 7 x64机器上的Visual Studio 2013编写代码。

+0

'verts2f'正在按值传递,因此您只是将顶点添加到本地副本。你可以显示调用这个函数的代码吗? – 2014-09-21 20:55:58

回答

1

您需要通过参考执行通得到修改verts2fmain

void ConvertToVector2F(vector<std::pair<float, float>> verts, 
         vector<Vector2f> &verts2f); 

而且这是希望的方式因为它可以避免昂贵的复制到参数中。这将更好:

void ConvertToVector2F(vector<std::pair<float, float>> &verts, 
         vector<Vector2f> &verts2f); 

现在只有两个向量的起始地址作为参数传递。

+0

我回到了这个问题,说我自己发现了同样的问题,但看起来像你和其他人打我。我解决了这个问题所带来的新问题。谢谢所有回复的人。 – user2828965 2014-09-21 21:22:27

2

声明功能

void ConvertToVector2F(vector<std::pair<float, float>> verts, 
         vector<Vector2f> &verts2f); 

即声明所述第二参数作为所述载体的引用。

至于我,然后我将宣布的功能

void ConvertToVector2F(const vector<std::pair<float, float>> &verts, 
         vector<Vector2f> &verts2f); 
+0

+1和对不起,先生,在我编辑后,我的回答不知不觉地和你的答案几乎一样。如果您的回答将被接受,我将不胜感激! – 2014-09-21 21:08:16

+0

@Kaidul伊斯兰没有什么奇妙的答案有时会吻合:) – 2014-09-21 21:10:27

+0

我很欣赏这种谦逊的举动,但是我发现在凯多尔的回答中额外的一点解释性文字是更有帮助的,没有针对你的攻击,弗拉德。我非常感谢你帮助我解决这个问题。 – user2828965 2014-09-21 21:24:42

相关问题