我在一个小型的基于dos的游戏(课程项目)中使用静态变量作为转换计时器。变量记录了状态效果消失之前的转数。下面是代码:std :: out_of_range on static int变量
for (auto &i : v) // <-- code that calls enemyAttack
enemyAttack(i, p, str, i.attack);
break;
void enemyAttack(Enemy &e, playerObject &p, std::array<std::string, NUM_MESSAGES> &str, void(*a)(playerObject &p, std::array<std::string, NUM_MESSAGES> &str)) {
int die = rand() % 100 + 1;
int d = 1;
a(p, str); // <-- Call function which causes the error
...
}
void batAttack(playerObject &p, std::array<std::string, NUM_MESSAGES> &str) {
static int time = 2;
static bool bit = false;
if (rand() % 10 < CHANCE_OF_STATUS_EFFECT && !bit) {
p.damage /= 2;
str[STATUS] += "WEAKENED ";
bit = true;
}
else if (time == 0) {
p.damage *= 2;
str[STATUS].replace(str[STATUS].find("WEAKENED ", 0), 9, "");
time = 2; // <-- error
bit = false;
}
else if (bit) {
time--;
}
}
我接收一个std :: out_of_range误差在第二条件内的线time = 2;
。该功能通过主要攻击函数的函数指针调用。错误似乎是随机的,MSVS报告所有变量具有发生错误时应该具有的值。
什么是'STATUS'?什么是'NUM_MESSAGES'?他们的价值是什么?请尝试创建[最小,**完整**和可验证示例](http://stackoverflow.com/help/mcve)并向我们显示。 –
另外,如果'str [STATUS] .find(“WEAKENED”,0)'没有找到你要找的字符串,你会怎么想呢?即使某些东西本该“永远不会发生”,它总是会! –
你不会偶然有多个线程会尝试访问这个静态变量在同一时间吗? – 9Breaker