Временное значение не живет достаточно долго - PullRequest
0 голосов
/ 13 февраля 2019

У меня проблемы с этим кодом.Я понятия не имею, почему это ошибки.Он должен принимать входные данные камеры и затем помещать их в структуру буфера, содержащуюся в структуре паттера.

extern crate rscam;
// use std::fs::File;
// use std::io::prelude::*;

const WIDTH: usize = 1280;
const HEIGHT: usize = 720;

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
struct Pyxel {
    r: u8,
    g: u8,
    b: u8,
}

impl Pyxel {
    fn new() -> Pyxel {
        Pyxel { r: 0, g: 0, b: 0 }
    }
}

#[repr(transparent)]
struct Buffer {
    pyxels: [[Pyxel; WIDTH]; HEIGHT],
}

// impl Buffer {
//  fn new(s: [[Pyxel; WIDTH]; HEIGHT]) -> Buffer {
//      Buffer {
//          pyxels: s,
//      }
//  }
// }

struct Putter {
    x: usize,
    y: usize,
    buffer: &'static mut Buffer,
}

impl Putter {
    fn put_pyxel(&mut self, r: u8, g: u8, b: u8) {
        if self.x >= WIDTH {
            self.move_down();
        }
        let col = self.x;
        let row = self.y;
        self.buffer.pyxels[row][col] = Pyxel { r: r, g: g, b: b };
        self.x += 1;
    }
    fn move_down(&mut self) {
        self.y += 1;
    }
    fn new() -> Putter {
        Putter {
            x: 0,
            y: 0,
            buffer: &mut Buffer {
                pyxels: [[Pyxel::new(); WIDTH]; HEIGHT],
            },
        }
    }
}

fn main() {
    let mut camera = rscam::new("/dev/video0").unwrap();
    camera
        .start(&rscam::Config {
            interval: (1, 30),
            resolution: (1280, 720),
            format: b"RGB3",
            ..Default::default()
        })
        .unwrap();

    let frame = camera.capture().unwrap();

    let mut putter = Putter::new();
}

Это ошибки:

error[E0597]: borrowed value does not live long enough
   --> src/main.rs:65:20
   |
57 |               buffer: &mut Buffer {
   |  __________________________^
58 | |                 pyxels: [[Pyxel::new(); WIDTH]; HEIGHT],
59 | |             },
   | |_____________^ temporary value does not live long enough
60 |           }
61 |       }
   |       - temporary value only lives until here
   |
  = note: borrowed value must be valid for the static lifetime..

Как использовать буфер внутриклюшки (структуры)?

По большей части я понимаю, что означает эта ошибка, а не как она работает.Мне просто нужен обходной путь или решение.Любая помощь приветствуется.Я мог бы написать это лучше, но я устал.

1 Ответ

0 голосов
/ 13 февраля 2019

Это более или менее логичная ошибка для меня.Вам следует внимательно прочитать о владении Rust .

Подумайте о том, как будет работать ваш код.

struct Putter {
    x: usize,
    y: usize,
    buffer: &'static mut Buffer,
}

Буфер - это ссылка, время жизни которой равно времени жизни программы, 'static сообщает компилятору об этом.Сообщение об ошибке довольно ясно, вы создаете временное значение на месте и заимствуете его.Он будет уничтожен сразу после выхода из области видимости, поэтому ваша ссылка будет указывать на недопустимую память.Висячие ссылки запрещены в Rust.На языке, подобном C ++, этот пример будет хорошо скомпилирован, но приведет к ошибке во время выполнения.

Чтобы решить эту проблему buffer следует переосмыслить собственное значение и дизайн структуры, сохраняя при этом внимание к временам жизни.

struct Putter {
    x: usize,
    y: usize,
    buffer: Buffer,
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...