我想避免设置设置大小的缓冲区,因为文件太大或太小以致缓冲区中有空白空间。听起来ArenaAllocator很有希望,因为您可以根据需要分配更多空间。是否有“正确”的方法来执行此操作,即加载作为命令行参数传递到缓冲区的 .json 文件?
我对学习 Zig 完全是菜鸟,所以我的问题可能是 na\xc3\xafve。
\n我正在尝试使用标准库中的字符串格式化函数在代码中创建各种字符串,例如std.fmt.allocPrint()
当我一次只处理一个字符串时,它是有效的,但是当我决定将其抽象为一个函数时,编译器告诉我allocPrint\ 的格式字符串是comptime.
我找不到任何方法来使用运行时格式字符串来实现相同的目的。
\n是否有一种完全不同的方式涉及不使用std.fmt或者我是否由于作为初学者而错过了一些基本的东西?
Nim 将自己的代码转换为 C 代码,并使用 C 编译器对其进行编译。Zig 有自己的编译器,它有许多不错的功能,会让您想要使用它,例如允许您选择要动态链接的 glibc 版本,或更容易的交叉编译。
因此,我想使用 Zig 编译器编译我的 nim 代码,但这可能吗?
在阅读Zig 语言参考后,我发现向量部分指出 a@Vector将在可能的情况下使用 SIMD 指令。后续有一个示例
const a = @Vector(4, i32){ 1, 2, 3, 4 };
const b = @Vector(4, i32){ 5, 6, 7, 8 };
// Math operations take place element-wise.
const c = a + b;
Run Code Online (Sandbox Code Playgroud)
,但我正在寻找是否可以编写一个循环来就地for操作单个指令 并保证使用 SIMD 指令。例如,我可以在 Julia 中使用 SIMD 指令,如下所示。@Vector
arr = Vector{Float64}(under, 32)
@simd for i in eachindex(arr)
@inbounds arr[i] = 2 * i
end
Run Code Online (Sandbox Code Playgroud)
感谢您的帮助!
我刚刚开始使用 Zig,并且来自 C++ 和 Rust;
我很早就被一个似乎无法解决的难题所困扰。或者在互联网上找到任何地方。
这就是我所拥有的:
// this doesn't work
pub const User = struct {
bot: bool,
id: *const [*:0]u8,
username: *const [*:0]u8,
pub fn init() User {
return User {
.bot = false,
.id = "THIS_IS_ID",
.username = "THIS_IS_USERNAME"
};
}
...
}
const user = User.init();
// this works vvv
id: *const [10:0]u8,
.id = "THIS_IS_ID",
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
// this doesn't work
pub const User = struct {
bot: bool,
id: *const [*:0]u8,
username: *const [*:0]u8,
pub …Run Code Online (Sandbox Code Playgroud) 我无法使用 zig 中的标准输出初始化全局变量:
var out = std.io.getStdOut().writer();
Run Code Online (Sandbox Code Playgroud)
然后我尝试在 中初始化fn main并将全局变量声明为可选(由 null 初始化)。
我的问题是我不知道哪种类型std.io.getStdOut().writer();。
我尝试过类似的东西:
var out: std.fs.Writer? = null
//...
fn main() !void {
out = std.io.getStdOut().writer();
//...
out.print("ok: {}", "ok");
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过反思:
var stdout: @typeInfo(@TypeOf(std.io.getStdOut().writer())).Fn.return_type.? = null;
Run Code Online (Sandbox Code Playgroud)
我需要知道如何声明一个变量或一个返回 Writer 的函数(即内部具有常用打印函数的东西)。
使用 zig 版本 0.12.0-dev.1150+3c22cecee 和 0.11.0 并列两次
writer.zig 文件包含:
const std = @import("std");
var out = std.io.getStdOut().writer();
pub fn main() anyerror!void {
try out.print("{any}\n", .{@TypeOf(out)});
}
Run Code Online (Sandbox Code Playgroud)
我收到错误:无法评估 comptime 表达式
zig build-exe writer.zig && …Run Code Online (Sandbox Code Playgroud) 是否可以comptime在 zig 中创建一个函数来生成新的结构类型?该函数将接收一个字符串数组和一个类型数组。字符串是后续结构字段的名称。
我正在关注Zig 中关于“comptime”的这篇博文。
以下行不再在 Zig 中编译0.6.0。
const user_input = try io.readLineSlice(buf[0..]);
Run Code Online (Sandbox Code Playgroud)
下面是完整的功能:
fn ask_user() !i64 {
var buf: [10]u8 = undefined;
std.debug.warn("A number please: ");
const user_input = try io.readLineSlice(buf[0..]);
return fmt.parseInt(i64, user_input, 10);
}
Run Code Online (Sandbox Code Playgroud)
当前版本(获取用户输入)中的等效项是什么?
我能够让 Zig 创建一个 C 库,但是当我尝试从 C 程序中使用所述库时,它无法找到包含函数的定义。
我的库定义:
const std = @import("std");
export fn removeAll(name: [*]const u8, len: u32) u32 {
const n: []const u8 = name[0..len];
std.fs.cwd().deleteTree(n) catch |err| {
return 1;
};
return 0;
}
test "basic remove functionality" {
}
Run Code Online (Sandbox Code Playgroud)
build.zig
const Builder = @import("std").build.Builder;
pub fn build(b: *Builder) void {
const mode = b.standardReleaseOptions();
const lib = b.addStaticLibrary("removeall", "src/main.zig");
lib.setBuildMode(mode);
switch (mode) {
.Debug, .ReleaseSafe => lib.bundle_compiler_rt = true,
.ReleaseFast, .ReleaseSmall => lib.disable_stack_probing = true,
} …Run Code Online (Sandbox Code Playgroud) 我想用 Zig 制作一个反序列化器。现在我可以在 comptime 中迭代字段信息。但我想获取 struct 中的字段默认值。有办法得到它们吗?例如,我想获取中zzzz的值。100getIntOrDefault
const std = @import("std");
const meta = std.meta;
const trait = meta.trait;
const assert = std.debug.assert;
pub fn deserializeInto(ptr: anytype) !void {
const T = @TypeOf(ptr);
comptime assert(trait.is(.Pointer)(T));
const C = comptime meta.Child(T);
ptr.* = switch (C) {
[]const u8 => "test string",
else => switch (@typeInfo(C)) {
.Struct => try deserializeStruct(C),
.Int => try getIntOrDefault(C),
else => @compileError("Unsupported deserialization type " ++ @typeName(C) ++ "\n"),
},
};
} …Run Code Online (Sandbox Code Playgroud)