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)'
错误的含义
我需要一些关于在 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)'