gpt4 book ai didi

rust - 临时值的生命周期不够长

转载 作者:行者123 更新时间:2023-11-29 08:26:38 25 4
gpt4 key购买 nike

我在使用这段代码时遇到了问题。我不知道为什么会出错。它应该获取相机输入,然后将其放入包含在推杆结构中的缓冲区结构中。

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..

如何使用推杆(结构)内的缓冲区?

在大多数情况下,我理解这个错误的含义,而不是它是如何工作的。我只需要一个解决方法或解决方案。任何帮助表示赞赏。我本可以写得更好,但我累了。

最佳答案

这对我来说或多或少是个逻辑错误。你应该仔细阅读 Rust ownership .

考虑一下您的代码将如何工作。

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

Buffer 是一个引用,它的生命周期等于程序的生命周期,'static 告诉编译器。错误消息非常清楚,您正在创建临时值并借用它。它将在退出作用域后立即销毁,因此您的引用将指向无效内存。 Rust 中禁止悬挂引用。在 C++ 之类的语言中,此示例可以正常编译,但会导致运行时错误。

要解决此问题,buffer 应该拥有自己的值(value),并且应该重新考虑结构设计,同时注意生命周期。

struct Putter {
x: usize,
y: usize,
buffer: Buffer,
}

关于rust - 临时值的生命周期不够长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54666192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com