问题标签 [zig]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
617 浏览

zig - 如何动态导入 zig 模块?

我正在使用 zig 0.7.0.,我正在尝试从数组中导入 zig 源文件列表。每个源文件都有一个我想调用的main函数(其返回类型是)。!void该数组module_names在编译时是已知的。

这是我试图做的:

即使数组在编译时已知,也会@import(module_name)给我这个错误:

如果数组是动态生成的并且只在运行时知道,我可以理解错误,但这里的module_names数组在编译时是已知的。所以我有点迷茫...

或者,我也尝试将整个main身体包裹在一个comptime块中:

这里@import(module_name)没有给我任何错误,但是由于log.info其他错误而失败:

这种动态导入可以在zig中实现吗?

0 投票
1 回答
395 浏览

c - zig 创建了一个 C 库,但 C 不能使用

我可以让 Zig 创建一个 C 库,但是当我尝试从 C 程序中使用所述库时,它无法找到包含函数的定义。

我的图书馆定义:

构建.zig

zig buildlibremoveall.a使用静态库创建构建目录。

我的 C 程序:

当我尝试将它包含在我的 C 程序中时,它会收到以下错误:

关于我做错了什么的任何想法?谢谢

编辑

感谢 Paul R 和斯塔克,翻转订单有效。你能帮我理解为什么顺序很重要吗?

0 投票
1 回答
270 浏览

memory-leaks - 使用 ArrayLists 构建切片时如何避免内存泄漏

std.ArrayList我正在尝试使用多个s构建一片切片。

下面的代码有效,但内存分配器std.testing.allocator会警告我在将新元素附加到sublist.

我尝试errdefer在几个地方使用来释放已分配的sublist,但没有奏效。从文档来看,这似乎是一个终身问题,但我不知道如何处理它。

std.ArrayList(T).items 切片的生命周期保持有效,直到下次调整列表大小时,例如通过附加新元素。— https://ziglang.org/documentation/master/#Lifetime-and-Ownership

list.append()失败时适当的错误处理是什么?

0 投票
1 回答
62 浏览

zig - 是否可以将 std.builtin.TypeInfo.Error 转换回其错误值?

该结构std.builtin.TypeInfo.Error仅包含一个name字段。而且由于不@nameToError存在函数,我看不到将其转换为错误值的方法。

在 zig 的 0.6 版中,该结构有一个value字段,该字段包含通过@intToError. 但那已经不存在了。

我在监督什么吗?

0 投票
1 回答
253 浏览

zig - zig cc 是否公开链接器(ld)?

我正在尝试在 Linux 上编译xz而不使用zig cc除 zig 之外的构建工具:

这是真的:系统没有链接器。zig 没有做广告:

可以/确实zig cc提供链接器吗?

0 投票
0 回答
344 浏览

zig - 在 Zig 中,你如何判断一个帧是否代表一个完全执行的函数?

在 Zig(当前使用 0.7.1)中,假设由于某种原因您没有任何好的方法来设计代码,而代码总是resume为每个suspend. 是否有任何受支持的方法可以在运行时检测给定帧是否已执行完成?

如果我记录这些帧结构的原始字节(据我所知,它们是不透明的并且不支持字段访问?我对 Zig 有点陌生),那么很明显帧的一部分是专用于标记是否返回:

然而,盲目地阅读这些数据似乎有点鲁莽,如果我知道结构布局得到保证或者有一些内置方法可以发现这些信息,我会感觉更舒服。

编辑::

特别是,我要解决的问题是,在设计事件循环时(例如,在 JS 和 Zig/WASM 之间进行接口时),您似乎必须将异步函数的实现与事件循环本身的 API 结合起来.

例如,内置事件循环具有yield()精确的功能,因此它可以进行必要的簿记以确保代码在每次挂起时有一个恢复,但据我所知,这是一个不必要的限制,因为帧是否返回似乎存储并易于访问。

我肯定有可能误解了 Zig 的 async/await 的目的,但我看不出有任何根本原因为什么能够处理任何异步函数的通用事件循环(不仅仅是那些遵守特定循环 API 的事件循环)不能'没有写,但我很难看到如果没有比文档指示的更多运行时内省,这是如何可能的。

0 投票
1 回答
83 浏览

zig - 不能使用二维数组的 .len

我有这个无法编译的简单代码。

编译器说:

问题是什么?

0 投票
1 回答
367 浏览

sse - 如何在有或没有 SIMD 内在函数的情况下从 Zig 构建和链接到 CGLM

我想链接并使用 cglm C 库。我正在使用 Zig 0.7.1 和 Zig 0.8.0 (master) 在没有 msvc 的 Windows 上工作(因此针对 gnu C ABI),没有任何运气。

我已经能够从 Zig build.zig 构建 CGLM 静态库,但没有运气从 Zig 程序链接它,因为报告了 CGLM SIMD 内在优化错误。

当我尝试使用链接的生成库构建/运行 exe 时,会报告以下错误(在 Zig 版本 0.7.1 和 0.8.0 master 中类似)Ex 来自 0.7.1 Zig 版本。

avxintrin.h 中的无法解析行如下

我想知道使用内在函数的 C 库现在是否可以工作,如果不能,我想从 build.zig 禁用内在函数特性 sse/avx/... 以便可以在没有 SIMD 的情况下构建和链接 CGLM优化。

编辑(从 build.zig 禁用 SIMD 功能)

我在 lib/zig/std/build.zig 上进行了一些研究,以了解如何禁用 SIMD 功能,最后我能够在 build.zig 上使用以下代码禁用

状态:

现在我能够构建(没有 SIMD 优化,这是不理想的)并从 zig 代码链接 CGLM 库,但真正令人担忧的问题出现了,因为调用标准 C tanf 函数的代码正在计算真正错误的结果。

按照为 glm_perspective 函数生成的 zig 代码。

执行 f = (1 / tanf((fovy * 0.5))); 的结果 arg_fovy = 0.785398185(45 度弧度)的行返回 134217728。这是完全错误的。正确的结果应该是大约。2.4142134

VSCode cppvsdbg 不允许我进入 tanf 以了解 tanf 实现可能有什么问题。

编辑(使用 Zig 编译器构建和编译最小 C 代码):

我使用数学 tanf 编译了一个 min C 案例,并使用 Zig 构建器机制构建。

构建.zig

src/main.c

如果我在没有 SIMD 排除的情况下构建,或者只是将目标设置为本机,则代码会以预期的结果正确执行。

$ zig build -Dtarget=native-windows-gnu 运行 -- 1

如果我使用 SIMD 排除项构建并执行它,则 tanf 返回 0

$ zig build -Dtarget=x86_64-windows-gnu 运行 -- 1

当前状态

在我看来,这

  • zig mingw64 或 msvcrt 不支持基本数学函数,并且在禁用 x86_64 架构 SIMD 功能时会出现浮点错误。
  • Zig mingw64 不支持 SIMD C 代码。
  • Zig 无法以可行的方式编译CGLM。

如果有人能带来一些启示,以防我遗漏了什么,将不胜感激。

提前致谢。

0 投票
2 回答
902 浏览

string - 如何在 Zig 编译时连接两个字符串文字?

如何在 Zig 编译时连接以下长度已知的字符串?

0 投票
1 回答
239 浏览

zig - 如何在 zig 中创建 2d 容器数组?

我正在尝试在 Zig 中分配 HashMap(u32, u1) 的二维数组:

但是,当我测试它时,调试器会抛出一个段错误。

谁能告诉我发生了什么以及如何解决它?

非常感谢!