2017-08-21 4 views
0

J'utilise une variable statique en tant que temporisateur de décalage dans une petite partie de jeu (projet de cours). La variable conserve la trace du nombre de tours avant qu'un effet d'état ne disparaisse. Voici le code:std :: out_of_range sur une variable statique 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--; 
    } 
} 

Je reçois un std :: erreur de out_of_range à la ligne time = 2; dans la deuxième condition. Cette fonction est appelée via un pointeur de fonction à partir d'une fonction d'attaque primaire. L'erreur semble être aléatoire et MSVS signale toutes les variables ayant la valeur qu'elles devraient avoir quand l'erreur se produit.

+0

Qu'est-ce que «STATUS»? Qu'est-ce que "NUM_MESSAGES"? Quelles sont leurs valeurs? S'il vous plaît essayez de créer un [Minimal, ** Complete **, et un exemple vérifiable] (http://stackoverflow.com/help/mcve) et nous montrer. –

+0

En outre, que pensez-vous que se passe si 'str [STATUS] .find (" WEAKENED ", 0)' ne trouve pas la chaîne que vous cherchez? Même si quelque chose est censé "ne jamais arriver", ça le sera toujours! –

+0

Vous n'avez pas par hasard plusieurs threads qui seraient en train d'essayer d'accéder à cette variable statique en même temps? – 9Breaker

Répondre

0

La ligne

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

est juste un désastre de se produire. Laissez regarder la recherche intérieure en premier.

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

Votre aide de la valeur « Affaiblissement du » deux fois dans le programme court lorsque vous faites cela assez vous souvent des erreurs d'orthographe, par conséquent, son préférable d'utiliser une valeur nommée ici, donc il n'y a aucune chance de faire des erreurs.

constexpr const char *WeakenedStr = "WEAKENED "; 

puis utilisez

str[STATUS].find(WeakenedStr , 0) 

Deuxièmement cela pourrait échouer, si la chaîne ne se trouve pas, il retourne 'npos' (qui est actuellement -1). Nous devons donc vérifier que trop

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

suivant est le '9' qui est un chiffre magique, cela aussi devrait être une valeur nommée

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

Donner

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

Note: code non testé, un bug se produira.

+0

IL TRAVAILLAIT !! Je vous remercie! Je suis à deux jours de la date limite et commençais à m'inquiéter. – user2200783