Trust Rust №4: Back to The Game

У меня есть две новости, плохая и хорошая. Но поскольку вас их эмоциональная окраска не касается, то начну с любой.
Я нашел причину падений своей игры. А вот и виновник торжества:
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". Но об этом будет моя следующая запись.
Рейтинг: 0
(0)


* редактировал Virtuos86 11:59 13 ноя 2017



Похожие записи в блоге:
  • Trust Rust №0: Начало - 13:14 12 окт 2017
  • Trust Rust №1: Типы учать думать - 13:58 12 окт 2017
  • Trust Rust №2: Смена декораций - 14:09 7 ноя 2017
  • Trust Rust №3: Так, здесь поподробнее - 14:11 12 ноя 2017


  • Этот блог сейчас читают: всего 0

    Просмотров: 72 | Комментариев: нет |


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