编程语言
首页 > 编程语言> > javascript – Emscripten:调用修改数组元素的C函数

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

作者:互联网

我有一个简单的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);

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

(请注意,您应该在适当的时候免费拨打电话.)

标签:emscripten,c-3,javascript,arrays,node-js
来源: https://codeday.me/bug/20190725/1528782.html