0

我需要一些帮助来创建一个数组作为 Zig 中的结构字段。

const VarStr = struct {
    buffer: [1000]u8,
    len: u8,
    pub fn init(str: []const u8) VarStr {
        var filled: u8 = 0;
        for (str) |char, ind| {
            .buffer[ind] = char;
            filled = ind + 1;
        }
        while (filled < 999) {
            .buffer[filled] = null;
        }
    }
};

当我编译时,它给了我以下错误

error: array access of non-array type '@Type(.EnumLiteral)'
            .buffer[ind] = char;
                   ^

我哪里做错了?请帮忙,谢谢。

4

1 回答 1

0

.buffer不是有效的 zig 语法*。Zig 在结构中没有任何类型的隐式this对象,因此您必须自己创建一个。

const VarStr = struct {
    buffer: [1000]u8,
    len: u8,
    pub fn init(str: []const u8) VarStr {
        var result: VarStr = .{
            .buffer = undefined,
            .len = @intCast(u8, str.len),
        };
        var filled: u8 = 0;
        for (str) |char, ind| {
            result.buffer[ind] = char;
            filled = ind + 1;
        }
        while (filled < 999) {
            result.buffer[filled] = null;
        }
    }
};

这段代码现在可以编译,但它会进入一个无限循环,因为filled在此期间永远不会改变。如果您尝试将前 999 个字节复制到其中buffer并用零填充其余字节,您可能会考虑:

var result: VarStr = .{
    .buffer = [_]u8{0} ** 1000, // zero-initialize buffer
    .len = std.math.min(str.len, @as(u8, 999)),
};
std.mem.copy(u8, &result.buffer, str[0..std.math.min(str.len, 999)]);

*:.buffer是 zig 枚举文字的语法。枚举文字用作使用枚举字段的简写。.buffer[index]没有意义,因为您无法索引枚举文字,这就是错误的含义array access of non-array type '@Type(.EnumLiteral)'

于 2022-02-28T18:37:17.457 回答