Emscripten:调用修改数组元素的 C 函数
Emscripten: Calling a C function that modifies array elements
>我有一个简单的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中使用click函数选择数组元素
- Javascript-函数获取数组元素参数未定义/为null
- 将数组元素传递给bob.js formatString函数
- 将jQuery事件函数应用于新的Knockout.js数组元素
- 通过javascript函数取消设置php数组元素
- Emscripten:调用修改数组元素的 C 函数
- Ajax 获取函数数组元素
- js函数未在IE 8中的数组元素中运行
- 将数组元素的数组传递给函数
- 使用递归函数删除所有重复的数组元素
- 如何使用JS数组元素定义使用参数对函数的调用
- 在javascript split函数中拆分数组元素
- 从Javascript函数访问PHP数组元素
- angular-Js:不能在同一个控制器的不同函数调用中访问数组元素
- Ruby在遍历函数时尝试存储数组元素
- 函数定义中使用的命名数组元素
- 定义一个函数在Meteor中匹配文档数组元素和文档值
- 从内部函数的父作用域访问数组元素
- 在For循环中从函数内部访问数组元素