我考虑过学习一点 Zig,并尝试对我创建的结构体的
std.ArrayList
进行原型维护,但一直得到 error{OutOfMemory}
。我已经尝试使用所有 Google-Fu,我必须搜索错误的各种组合,并使用带有 ArrayList 的结构,但无济于事。
这个问题(Malloc to a List of Struct in Zig)似乎是最接近的解决方案,但我宁愿事情是动态的,也不愿分配比我认为需要的更多的内存。
这是我编写的代码,作为测试:
const std = @import("std");
const Backtrace = struct {
node: usize, distance: u8
};
pub fn main() void {
const allocator = std.heap.page_allocator;
var backtrace = std.ArrayList(Backtrace).init(allocator);
defer backtrace.deinit();
const nodes = [_]usize{1, 3, 5, 7, 9, 11};
for (nodes) |n,d| {
std.debug.print("{}: {}\n", .{n, d});
try backtrace.append(.{.node = n, .distance = @truncate(u8, d)});
}
}
这段代码的灵感来自于这个问题(Search ArrayList of Structs in Zig)。
这是在终端中运行它时得到的输出:
$> zig run allocations.zig
allocations.zig:16:5: error: expected type 'void', found 'error{OutOfMemory}'
try backtrace.append(.{.node = n, .distance = @truncate(u8, d)});
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/homebrew/Cellar/zig/0.10.1/lib/zig/std/mem/Allocator.zig:10:19: note: error set declared here
pub const Error = error{OutOfMemory};
^~~~~~~~~~~~~~~~~~
allocations.zig:7:15: note: function cannot return an error
pub fn main() void {
^~~~
referenced by:
comptime_0: /opt/homebrew/Cellar/zig/0.10.1/lib/zig/std/start.zig:59:50
remaining reference traces hidden; use '-freference-trace' to see all reference traces
最后,以防万一,我使用的是随 Homebrew 安装的 Zig 版本
0.10.1
。