微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

不能使用二维数组的 .len

如何解决不能使用二维数组的 .len

我有一个无法编译的简单代码

const s = [_][_]int {
    [_]int{08,02,22,97,38,15,00},[_]int{49,49,99,40,17,81,18},[_]int{81,31,73,55,79,14},[_]int{52,70,95,23,04,60,11},[_]int{22,16,71,51,67,63},[_]int{24,47,32,03,45},[_]int{32,98,28,64,67},[_]int{67,26,20,68,62,12},58,05,66,99},[_]int{21,36,09,75,00,76}
};

pub fn main() void
{
    const w = s[0].len;
    const h = s.len;
}

编译器说:

./a.zig:1:14: error: inferred array size invalid here
const s = [_][_]int {
             ^
./a.zig:16:15: note: referenced here
    const w = s[0].len;

有什么问题?

解决方法

我很想知道有一个更深层次的原因,但我的简单理解是当前的语法 [N]T 允许使用 _ 来省略数组大小,但不能超过一个维度。

因此,您可以使用以下方法解决您的问题(注意,我使用了 u8,因为我不确定您的 int 是什么):

const s = [_][7]u8{
  // Your items
}

我怀疑这是因为解析规则的应用方式,所以 [7]u8 将是嵌套数组将保存的类型,编译器将使用它来检查内容是否都是 {{1 }};您可以通过将其中一行修改为具有 6 个元素并检查由此产生的错误来确认这一点。

如果您想要可变数量的项目,您可以开始查看切片数组:[7]u8,但我认为这不是您目前想要的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。