此代码有问题。我不知道为什么会出错。 应该先获取摄像机的输入,然后将其放入缓冲区结构(包含在推杆结构中)。
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..
如何使用推杆内部的缓冲区(结构)?
在大多数情况下,我了解此错误的含义,而不是其工作原理。我只需要一种解决方法或解决方案。任何帮助表示赞赏。我本可以写得更好,但是我很累。
答案 0 :(得分:2)
这对我来说或多或少是逻辑错误。您应该仔细阅读Rust ownership。
考虑一下代码的工作方式。
struct Putter {
x: usize,
y: usize,
buffer: &'static mut Buffer,
}
Buffer是一个引用,您的生存期等于程序的生存期,
'static
告诉编译器。错误消息非常清楚,您正在就位创建临时值并借用它。退出作用域后将立即销毁它,因此您的引用将指向无效的内存。在Rust中,禁止使用悬挂引用。在像C ++这样的语言中,此示例可以很好地编译,但是会导致运行时错误。
要解决此问题,buffer
应该在保持生命周期的同时重新考虑自身的价值和结构设计。
struct Putter {
x: usize,
y: usize,
buffer: Buffer,
}