javascript - Web 程序集 - 整数值错误

标签 javascript c webassembly

在我的网络汇编应用程序中,我似乎无法让整数在 javascript 和 c 之间正确传递。

// C
int *g_id; // Pointer to array of integers (IDs) {0,1,2,3,4,5,6...}

int test(int id) {
  for (int i = 0; i < g_bufSize; i++) {
    if (g_id[i] == id) {
      return g_id[i];
    }
  }
  return -1;
}

Javascript 调用:

// JS
ccall("test", "number", ["number"], [2]);

我希望它返回 g_id[2] 处的值,即 2,但它总是返回 -1

如果我总是返回g_id[2],那么它会返回一个大整数,例如184638192,除非i0 code> 当它返回 0 时。

如果我返回一个指向数组元素之一的指针return &g_id[2],那么它会正确返回一个指向数组元素的指针,我可以使用以下 JavaScript 取消引用:

// JS
var pointer_return = ccall("test", "number", ["number"], [2]);
var value = Module["HEAPF32"][pointer_return/Float32Array.BYTES_PER_ELEMENT];

这是一个不错的解决方法。然而,C 代码中的相等性检查仍然不起作用。

我觉得我误解了在 C 代码和 JS 之间传递变量的一些基本知识。

感谢您的帮助。

最佳答案

事实证明,如果您将变量分配给 C 中的整数数组,则必须使用 HEAP32 或其他整数堆来传递它们。所以在这种情况下,最后一行变成:

var value = Module["HEAP32"][pointer_return/Int32Array.BYTES_PER_ELEMENT];

关于javascript - Web 程序集 - 整数值错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49533435/

相关文章:

c++ - 堆通常是如何实现的?

c++ - 是否有一个选项不自动将所有前导下划线 _ 导出到 emscripten 中的函数?

go - syscall/js websocket回调在非阻塞行为中不响应

javascript - 复制模式但更改文本和图像

javascript - 循环向上计数的倒计时

javascript - 永远是平局!剪刀石头布游戏

javascript - Bootstrap 模式弹出窗口显示状态 -3 错误

c++ - Arduino 串行监视器上的垃圾。如何解决?

c - 检测所有当前发出信号的信号量

没有 Blazor 的 C# WASM