gpt4 book ai didi

javascript - Emscripten:调用修改数组元素的 C 函数

转载 作者:搜寻专家 更新时间:2023-10-31 23:31:38 25 4
gpt4 key购买 nike

我有一个简单的 C 函数,用于修改整数数组的元素。我可以毫无问题地使用 Emscripten (emcc) 将它转换为 JavaScript。但是当我在 JS 数组上调用函数时,其中的值似乎没有改变。请帮忙。

这是 C 函数定义:

/* modify_array.c */
void modify_array(int X[8]) {
int i;
for (i = 0; i < 8; ++i) {
X[i] += 1;
}
}

这是我用来将 C 代码转译为 JS 的命令:

emcc modify_array.c -o modify_array.js -s EXPORTED_FUNCTIONS="['_modify_array']"

这是调用转换后的 JS 代码的 JavaScript (Node.js) 代码:

var mod = require("./modify_array.js");
var f = mod.cwrap("modify_array", "undefined", ["array"]);

var X = [0, 1, 2, 3, 4, 5, 6, 7];
var bytesX = new Uint8Array(new Int32Array(X).buffer);

/* Invoke the emscripten-transpiled function */
f(bytesX);


console.log(new Int32Array(bytesX.buffer));

运行 JS 代码后,缓冲区包含与原始值相同的值,而不是增量值。为什么?我怎样才能得到更新的值?

最佳答案

Emscripten 的内存模型是一个平面数组。这意味着当您向已编译的 C 方法提供数据数组时,它会被复制到单个数组中,这是它唯一可以访问的地方(ccall/cwrap 方法为您做这件事)。换句话说,您传递的所有参数都是按值传递的,而不是按引用传递的,即使它们是数组(在 JS 中通常是按引用传递)。

要在 emscripten 内存模型中工作,您可以在单个平面数组中使用内存,

var ptr = Module._malloc(8);
var view = Module.HEAPU8.subarray(ptr, ptr+8);
var f = Module.cwrap("modify_array", "undefined", ["number"]);
f(ptr);

在单个数组中保留一个空间,并使用单个数组上的子数组,我们可以访问它的值。请注意使用 number 作为类型。我们正在传递 ptr,它是指向缓冲区的指针。作为一个指针,它只是一个指向单个数组中某个位置的数字。

(注意要在合适的时候调用free来释放内存。)

关于javascript - Emscripten:调用修改数组元素的 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28202744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com