Zig error: Array access of non-array type

Zig error: Array access of non-array type

我需要一些关于在 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;
                   ^

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

.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 枚举文字的语法。枚举文字用作 shorthand 以使用枚举字段。 .buffer[index] 是无意义的,因为您无法索引枚举文字,这就是 array access of non-array type '@Type(.EnumLiteral)'

错误的含义