从对转换为Vector2f导致超出范围错误

时间:2014-09-21 20:53:05

标签: c++ vector

我正在使用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编写。

2 个答案:

答案 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);

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