如何定义大小不同的数组的 comptime 数组

问题描述 投票:0回答:2

我对 zig 很陌生,正在做一个非常简单的编码练习。问题是关于拼字游戏中的单词评分,并提供了一个表格。作为一种挑战,我想将评分表复制为数组数组,其中外部数组的索引代表字母的分数,内部数组包含与该分数匹配的字母。然后我想将其转换为

comptime
中的查找表(实际上只是分数的平面数组)。我还希望能够更改表格而无需更改任何转换代码。

我目前在声明多维输入数组的最初部分遇到困难。我试过这个:

const point_letters = [_][_]u8){
    [_]u8{'A', 'E', 'I', 'O', 'U', 'L', 'N', 'R', 'S', 'T',},
    [_]u8{'D', 'G',},
    [_]u8{'B', 'C', 'M', 'P',},
    [_]u8{'F', 'H', 'V', 'W', 'Y',},
    [_]u8{'K',},
    [_]u8{},
    [_]u8{},
    [_]u8{'J', 'X',},
    [_]u8{},
    [_]u8{'Q', 'Z',},
};

以及

const point_letters = [_](*[_]u8){
    ([_]u8{'A', 'E', 'I', 'O', 'U', 'L', 'N', 'R', 'S', 'T',}).*,
    ([_]u8{'D', 'G',}).*,
    ([_]u8{'B', 'C', 'M', 'P',}).*,
    ([_]u8{'F', 'H', 'V', 'W', 'Y',}).*,
    ([_]u8{'K',}).*,
    ([_]u8{}).*,
    ([_]u8{}).*,
    ([_]u8{'J', 'X',}).*,
    ([_]u8{}).*,
    ([_]u8{'Q', 'Z',}).*,
};

但是它们都给出了相同的错误,指向内部数组的大小:

error: unable to infer array size

非常感谢帮助

multidimensional-array literals zig
2个回答
0
投票

这似乎有效:

const std = @import("std");

pub fn main() void {
    const point_letters = [10][]const u8{ "AEIOULNRST", "DG", "BCMP", "FHVWY", "K", "", "", "JX", "", "QZ" };
    std.debug.print("Point_letters = {s}\n", .{point_letters[0]});
}

但我不确定这是否适用于拼字游戏,也不确定这是否准确地代表了您所拥有的内容,主要是空元素。集合可能会工作得更好,但不存在这样的原始类型。无论如何,您可以在这些字符串中搜索特定字母,如here所解释,例如(使用

std.mem


0
投票

Zig 中的数组是同质的,即所有元素都具有相同的类型。

由于数组的长度是其类型的一部分,因此尝试创建包含不同长度数组的数组是不可能的。

可以做的是创建一个包含切片的数组,因为切片由一个指针(指向存储在其他地方的数组)和一个整数组成,即所有切片都具有相同的类型。

所以首先需要将

point_letters
的类型更改为
[_][]u8

然后,要构造切片,您必须使用

&[]u8{ … }
而不是
[_]u8{ … }
。另外,编译器告诉我,
@constCast
是必需的。

这有效:

const point_letters = [_][]u8 {
    @constCast(&[_]u8{'A', 'E', 'I', 'O', 'U', 'L', 'N', 'R', 'S', 'T',}),
    @constCast(&[_]u8{'D', 'G',}),
    // …
};

为了使其不那么冗长,您可以使用在编译时执行的辅助函数:

fn slice(comptime a: anytype) []u8 {
    return @constCast(&a);
}

const point_letters = [_][]u8 {
    slice([_]u8{'A', 'E', 'I', 'O', 'U', 'L', 'N', 'R', 'S', 'T',}),
    slice([_]u8{'D', 'G',}),
    // …
};
© www.soinside.com 2019 - 2024. All rights reserved.