1

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

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

问题是什么?

4

1 回答 1

1

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

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

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

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

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

于 2021-02-19T23:09:53.240 回答