2017-08-21 64 views
0

我在一个小型的基于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报告所有变量具有发生错误时应该具有的值。

+0

什么是'STATUS'?什么是'NUM_MESSAGES'?他们的价值是什么?请尝试创建[最小,**完整**和可验证示例](http://stackoverflow.com/help/mcve)并向我们显示。 –

+0

另外,如果'str [STATUS] .find(“WEAKENED”,0)'没有找到你要找的字符串,你会怎么想呢?即使某些东西本该“永远不会发生”,它总是会! –

+0

你不会偶然有多个线程会尝试访问这个静态变量在同一时间吗? – 9Breaker

回答

0

线

str[STATUS].replace(str[STATUS].find("WEAKENED ", 0), 9, ""); 

只是等待发生的灾难。先看看内部的发现。使用值

str[STATUS].find("WEAKENED ", 0) 

你在执行此操作时往往不够,你将有拼写错误的短节目“周小平”的两倍,因此它能够更好地所以没有犯错误的机会,在这里使用了一个名为值。

constexpr const char *WeakenedStr = "WEAKENED "; 

然后用

str[STATUS].find(WeakenedStr , 0) 

其次,这可能会失败,如果字符串没有找到返回“非营利组织”(这是目前-1)。因此,我们需要测试过

auto pos = str[STATUS].find("WEAKENED ", 0); 
if (pos != std::string::npos) 
    str[STATUS].replace(pos, 9, ""); 

下一个是“9”,这是一个神奇的数字,这也应该是一个名为值

constexpr const char *WeakenedStr = "WEAKENED "; 
const int WeakenedStrLen = strlen(WeakenedStr); // strlen is sadly not constexpr. 

给予

auto pos = str[STATUS].find("WEAKENED ", 0); 
if (pos != std::string::npos) 
    str[STATUS].replace(pos, WeakenedStrLen, ""); 

注意:未经测试的代码,将发生错误。

+0

它工作了!谢谢!我距离到期日只有两天,并开始担心。 – user2200783