gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:33:20 27 4
gpt4 key购买 nike

我有一个“抽奖”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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com