GunChleoc - this is not about zero division but about out-of-range - I think.

Do you think that problem is that genstats is not populated some very short 
time after loading and AI tries to access members that are not there yet? So 
that genstats.size()==0? 

If this is the case I would use other aproach then try-catch...

Also see comments in diff, default decision for AI if it can not get data on 
military strength of enemy should be 'do not attack'




Diff comments:

> === modified file 'src/ai/defaultai.cc'
> --- src/ai/defaultai.cc       2014-10-31 20:49:02 +0000
> +++ src/ai/defaultai.cc       2014-11-01 14:10:33 +0000
> @@ -698,7 +698,7 @@
>               }
>       }
>  
> -     // folowing is done allways (regardless of military or not)
> +     // the following is done always (regardless of military or not)
>  
>       // we get immovables with higher radius
>       immovables.clear();
> @@ -710,6 +710,7 @@
>       field.military_presence_ = 0;
>  
>       for (uint32_t i = 0; i < immovables.size(); ++i) {
> +
>               const BaseImmovable& base_immovable = *immovables.at(i).object;
>  
>               // testing if it is enemy-owned field
> @@ -3089,20 +3090,27 @@
>       const Game::GeneralStatsVector& genstats = 
> game().get_general_statistics();
>       for (uint8_t j = 1; j <= plr_in_game; ++j) {
>               if (pn == j) {
> -                     player_attackable[j - 1] = false;
> +                     player_attackable.at(j - 1) = false;
>                       continue;
>               }
>  
> -             if (genstats[j - 1].miltary_strength.back() == 0) {
> -                     // to avoid improbable zero division
> -                     player_attackable[j - 1] = true;
> -                     any_attackable = true;
> -             } else if ((genstats[pn - 1].miltary_strength.back() * 100 /
> -                         genstats[j - 1].miltary_strength.back()) > 
> treshold_ratio) {
> -                     player_attackable[j - 1] = true;
> -                     any_attackable = true;
> -             } else {
> -                     player_attackable[j - 1] = false;
> +             try {
> +                     // Avoid division by zero
> +                     if (genstats.at(j - 1).miltary_strength.empty() ||
> +                              genstats.at(j - 1).miltary_strength.back() == 
> 0) {
> +                             player_attackable.at(j - 1) = true;
> +                             any_attackable = true;
> +                     // Check threshold
> +                     } else if ((genstats.at(pn - 1).miltary_strength.back() 
> * 100 /
> +                                                     genstats.at(j - 
> 1).miltary_strength.back()) > treshold_ratio) {
> +                             player_attackable.at(j - 1) = true;
> +                             any_attackable = true;
> +                     } else {
> +                             player_attackable.at(j - 1) = false;
> +                     }
> +             } catch (const std::out_of_range&) {
> +                     player_attackable.at(j - 1) = true;

change to false

> +                     any_attackable = true;

remove the line

>               }
>       }
>  
> 


-- 
https://code.launchpad.net/~widelands-dev/widelands/bug-1388028/+merge/240357
Your team Widelands Developers is subscribed to branch 
lp:~widelands-dev/widelands/bug-1388028.

_______________________________________________
Mailing list: https://launchpad.net/~widelands-dev
Post to     : widelands-dev@lists.launchpad.net
Unsubscribe : https://launchpad.net/~widelands-dev
More help   : https://help.launchpad.net/ListHelp

Reply via email to