c++ - 抽奖分类程序上的 EXC_BAD_ACCESS

标签 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 speed。我这样称呼这个函数:

order=speedRaffle(players,pNum);

其中玩家是 vector ,pNum 是整数。我做错了什么?

最佳答案

<强>1。您正在尝试访问索引 k 处的元素在空 vector 中 order

它崩溃是因为 vector order当您调用 order[k] = *iter; 时为空, 你应该使用 push_back函数改为:order.push_back(*iter); .

<强>2。您将循环用于“移动”迭代器而不是简单的 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。 vector中的元素可以通过索引直接访问
在这种情况下,您根本不需要任何迭代器。

<强>5。按值传递 vector 而不是按引用传递 vector

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

请注意, vector 的拷贝 players每次调用此函数时都会创建。你不想那样做。您也不想在函数内部更改此 vector ,因此将此参数声明为 const会好得多:

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

6.您的代码没有执行您需要它执行的操作

“它应该采用所有玩家的速度并计算它们的平方。然后,它将那么多(速度的平方)“抽奖券”放入 spdtics。然后它从 spdtics 随机抽取一张“票”,并将拥有该票的玩家的号码排序。然后,它再次重复,直到所有玩家都被抽到,而不是抽到同一个玩家两次。它返回玩家获胜的顺序。”

据此,您的函数应如下所示:

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() 则为参数.

希望对您有所帮助。

关于c++ - 抽奖分类程序上的 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9249582/

相关文章:

C++ & 不同用法

c++ - 使用指向 STL 映射的指针的操作

c++ - 我可以使用 void* 作为函数的参数吗?

c++ - 异常代码 "EXC_I386_GPFLT"是什么意思?

ios - Swift 中的 UIAppearance 和圆角边框

c++ - 将多维数组的地址复制到指针时的指针维度

c++ - 将 uint8 转换为范围 0-1 的 float 的最有效方法

ios - 错误访问物理场导致应用程序 SWIFT、XCODE 崩溃

ios fwrite 函数 EXC_BAD_ACCESS

iphone - 返回时可能导致 [UIImage imageWithData] 崩溃的原因