счётчик по фронту импульса

67 views
Skip to first unread message

ibx

unread,
Oct 29, 2015, 8:04:39 AM10/29/15
to Rust по-русски
Подскажите пожалуйста, что не правильно и как оптимизировать?
Как то всё длинно получается.

use std::io;

fn count(n: &bool) -> u8 {
    let mut m0: bool = false;
    let m = &mut m0;
    let mut ct0: u8 = 0;
    let ct = &mut ct0;
    if (*n && !*m) == true {
        *ct +=1
    }
    *m = *n;
    
    return *ct;
}


fn main() {
    loop {
        println!("Введите n:");
        let mut n = bool::new();
        io::stdin().read_bool(&mut n)
            .ok()
            .expect("не удалось прочитать значение");
        println!("{}", ct);
    }
}

Vladimir Matveev

unread,
Oct 29, 2015, 8:19:05 AM10/29/15
to ibx, Rust по-русски
Здравствуйте!

Если честно, то я вообще не понимаю, что ваша функция должна делать. В текущем варианте count() - это чистая функция, которая всегда возвращает одни и те же значения для true и для false соответственно. Кстати, что такое read_bool()? В стандартной библиотеке такого метода нет.

Непонятно также, зачем вам столько указателей в count. Вот вариант без указателей, который работает точно так же:

fn count(n: bool) -> u8 {
let mut m = false;
let mut ct: u8 = 0;
if n && !m {
ct += 1;
}
m = n;
ct
}

Вероятно, так лучше видно, что функция весьма странная. Зачем, например, переприсваивать m, если это локальная переменная и её больше никто не увидит? Более того, m всегда false => !m всегда true => `&& !m` - это лишнее условие. Вообще всё это эквивалентно такому:

fn count(n: bool) -> u8 {
if n { 1 } else { 0 }
}

Опишите, пожалуйста, поподробнее, что вам нужно получить.
> --
> Вы получили это сообщение, поскольку подписаны на группу "Rust по-русски".
> Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес rust-russian...@googlegroups.com.
> Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/rust-russian/e85a2e24-cc94-41b2-8511-db7f8ccc1151%40googlegroups.com.
> Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

ibx

unread,
Oct 29, 2015, 8:42:11 AM10/29/15
to Rust по-русски
Счётчик срабатывает только при изменении "n" с false на true , значения счётчика накапливаются от цикла к циклу, для этого и цикл loop.
io::stdin().read_bool(&mut n) - неуклюжая попытка введения значения n: bool из терминала в каждом цикле.


четверг, 29 октября 2015 г., 16:04:39 UTC+4 пользователь ibx написал:

ibx

unread,
Oct 30, 2015, 5:20:22 AM10/30/15
to Rust по-русски
Собственно вот то, что хотелось получить только на Go.


четверг, 29 октября 2015 г., 16:04:39 UTC+4 пользователь ibx написал:
Подскажите пожалуйста, что не правильно и как оптимизировать?

Владимир Матвеев

unread,
Oct 30, 2015, 5:31:40 AM10/30/15
to Rust по-русски
В таком случае вам нужен простой цикл с внешней переменной для хранения истории:

use std::io::{self, BufRead};

fn main
() {
    let input
= io::stdin();
    let mut input
= input.lock();

    let mut prev
= false;
    let mut count
= 0;
    loop
{
        let
next = if let Some(b) = read_bool(&mut input) { b } else { break };
       
if !prev && next {
            println
!("Signal edge encountered, increasing counter");
            count
+= 1;
       
}
        prev
= next;
   
}
    println
!("Total edges: {}", count);
}

fn read_bool
<B: BufRead>(input: &mut B) -> Option<bool> {
    input
.lines().next()
       
.map(|line| match &*line.unwrap() {
           
"true" | "1" => true,
           
"false" | "0" => false,
            _
=> panic!("unexpected input")
       
})
}


четверг, 29 октября 2015 г., 15:42:11 UTC+3 пользователь ibx написал:

ibx

unread,
Nov 2, 2015, 3:50:22 AM11/2/15
to Rust по-русски
Спасибо!. Чувствую без без русского учебника.......


Michael Pankov

unread,
Nov 6, 2015, 12:31:03 PM11/6/15
to Rust по-русски
 А чего вы наш перевод не читаете?

http://kgv.github.io/rust_book_ru/
Reply all
Reply to author
Forward
0 new messages