抽奖分拣程序上的EXC_BAD_ACCESS

时间:2012-02-12 14:35:27

标签: c++ exc-bad-access

我有一个“抽奖”的C ++程序,我用它来“抽出一顶帽子”。但是,当我尝试使用它时,我收到一个EXC_BAD_ACCESS信号。这是功能:

vector<int> speedRaffle(vector<Player>players,int pNum){
    vector<int> spdtics,order;
    int ticnum,randy;
    vector<int>::iterator iter = spdtics.begin();
    for (int k=0;k<pNum;k++){
        for (int i=0; i<pNum; i++) {
            for (int j=0; j<pow(players[i].speed,2); j++){
                for (int io=0; io<order.size(); io++) {
                    if(order[io]!=i){
                        spdtics.push_back(i);
                        ticnum++;
                    }
                }
            }
        }
        randy=random() % ticnum;
        for(int i=0;i<randy;i++){
            iter++;

        }
        order[k]=*iter; //Thread 1: Program received signal: "EXC_BAD_ACCESS". 
        iter=spdtics.begin();

    }
return order;
}

此功能应该取消所有玩家的速度并将其平方。然后,它将许多(速度的方块)“抽奖券”放入spdtics中。然后它从spdtics中随机抽取一张“票”,并将拥有该票的玩家的号码按顺序排列。然后,它再次重复,直到所有玩家都被抽出,而不是两次吸引同一个玩家。它返回玩家赢得的顺序。

类Player包含int速度。我把这个函数称为:

order=speedRaffle(players,pNum);

其中玩家是向量而pNum是int。我做错了什么?

1 个答案:

答案 0 :(得分:1)

<强> 1。您正尝试在空向量k

中访问索引为order的元素

当您拨打order时,因为向量order[k] = *iter;为空而崩溃,您应该使用push_back函数:order.push_back(*iter);

<强> 2。你使用循环来移动&#34;迭代器而不是简单的advance调用

advance(iter, randy - 1);与此循环具有相同的效果:for(int i=0;i<randy;i++){ iter++; }

第3。您在每次迭代中调用pow

for (int j=0; j<pow(players[i].speed,2); j++)

请注意,这会更快:

int maxspeed = pow(players[i].speed,2);
for (int j = 0; j < maxspeed; j++)

<强> 4。可以使用索引
直接访问向量中的元素 在这种情况下,你根本不需要任何迭代器。

<强> 5。按值传递矢量而不是通过引用传递

vector<int> speedRaffle(vector<Player>players,int pNum)

注意,每次调用此函数时都会创建向量players的副本。你不想这样做。您也不想在函数内部更改此向量,因此将此参数声明为const会更好:

vector<int> speedRaffle(const vector<Player>& players, int pNum)

<强> 6。您的代码无法执行您需要的操作

&#34;它应该吸引所有玩家&#39;速度和方格。然后,它放了很多(速度的方格)&#34;抽奖券&#34;进入spdtics。然后随机抽取一张票&#34;来自spdtics,并将拥有该票证的玩家的号码按顺序排列。然后,它再次重复,直到所有玩家都被抽出,而不是两次吸引同一个玩家。它返回玩家赢得的顺序。&#34;

根据这个,你的功能应该是这样的:

vector<int> speedRaffle(vector<Player>& players)
{
    // create vector of tickets:
    set<int> ticketOwners;
    vector<int> spdtics;
    for (int i = 0; i < players.size(); i++)
    {
        ticketOwners.insert(i);
        int maxspeed = pow(players[i].speed,2);
        for (int j = 0; j < maxspeed; j++)
        {
            spdtics.push_back(i);
        }
    }
    // draw ticket for every player:
    vector<int> order;
    while (!ticketOwners.empty())
    {
        set<int>::const_iterator to;
        int randy;
        do
        {
            randy = random() % spdtics.size();
            to = ticketOwners.find(spdtics[randy]);
        }
        while (to == ticketOwners.end());
        spdtics.erase(spdtics.begin() + randy);
        order.push_back(*to);
        ticketOwners.erase(to);
    }
    return order;
}

另请注意,如果pNum等于players.size(),则不需要{{1}}个参数。

希望这会对你有所帮助。