gpt4 book ai didi

arrays - 来自范围的常量数组

转载 作者:行者123 更新时间:2023-12-04 02:26:05 29 4
gpt4 key购买 nike

如何生成一个长数组,其中的值取自一个范围?奖励:1) 使用 no_std,2) 不使用任何 crate

我想做什么:

struct A {
a: i32,
b: B
}

enum B {
One,
Two
}

const AS: [A; 1024] = [A{a: 1, b: B::One}, A{a: 2, b: B::One}, ..., A{a: 1024, b: B::One}]

到目前为止我得到的最远的是:

macro_rules! generate_list {
($($a:expr)+, $variant:expr) => {
[ $( A { a: $a, b: $variant } )* ]
}
}
const AS: [A; 1024] = generate_list!(1..1025i32, B::One);

至少有一个问题似乎是在将范围表达式扩展为文字列表之前对宏求值。

最佳答案

我不确定它是否惯用,但也许以下内容适用于您的用例:

#[derive(Debug, Copy, Clone)]
pub struct A {
a: i32,
b: B,
}

#[derive(Debug, Copy, Clone)]
pub enum B {
One,
Two,
}

const fn gen_array<const N: usize>(offset: i32, b: B) -> [A; N] {
let mut res = [A { a: offset, b }; N];

let mut i = 0;
while i < N as i32 {
res[i as usize].a = offset + i;
i += 1;
}

res
}

const AS: [A; 42] = gen_array(0, B::One);

fn main() {
println!("{:#?}", AS);
}

Playground

我使用了 while 循环,因为 for 循环目前在 const 上下文中是不允许的,如 E0744表示。

以上将为 AS 生成 42 个值,偏移量为 0:

[
A {
a: 0,
b: One,
},
A {
a: 1,
b: One,
},
...
A {
a: 41,
b: One,
},
]

Godbolt Compiler Explorer表明它生成的指令与手动编写的指令相同。

关于arrays - 来自范围的常量数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67538438/

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