| категории | закладки | история | добавить | RSS |
  

11:51 13-11-2017 Virtuos86

У меня есть две новости, плохая и хорошая. Но поскольку вас их эмоциональная окраска не касается, то начну с любой.
Я нашел причину падений своей игры. А вот и виновник торжества:

pub fn GenerateMonsters() {
let mut v = vec!();
for mt in MonsterTypes.iter() {
if (mt.Level == unsafe {map::CUR_MAP as u32}) && map::random(0, 6) == 0 { // проблемная строчка
v.push(*mt);
};
}
for i in 0..MaxMonsters - 1 {
let mut m: TMonster = v[map::random(0, v.len())];
let (x, y) = map::FreeMapPoint(get_ref_curmap!());
m.x = x;
m.y = y;
unsafe { MONSTERS[i] = m; }
}
}

Как говорится в одном старом анекдоте, "на третий день томящийся в плену индеец Зоркий Глаз заметил, что в сарае, куда его заперли, нет одной стены". Суть в том, что условие "map::random(0, 6) == 0" с вероятностью 5/6 не выполнится ни для одного "mt", а значит массив "v" останется пустым. А потом я передаю в функцию по сути два нуля, потому что длина пустого массива равна нулю: "map::random(0, v.len())"
Функция "random" определена так:
pub fn random(start: usize, end: usize) -> usize {
use rand::{thread_rng, sample};
if end <= start { panic!("End={} should be more than Start={}", end, start) }; // здесь мы падаем, когда end == start
let mut rng = thread_rng();
sample(&mut rng, start..end, 1)[0]
}


Да, другая новость в том, что мои декорасторы не работают, если в определении функции лишние пробелы, например, перед скобками с аргументами, или после имени функции, или после кейворда "fn". Но об этом будет моя следующая запись.



Virtuos86
2017-11-13T11:51:46Z
0 нейтральный
Рейтинг: 4
голосов: 5




Здесь находятся
всего 0. За сутки здесь было 0 человек

Напомнить пароль