使用emscripten将数组传递给C函数

时间:2016-10-17 09:41:04

标签: c arrays emscripten

我认为这个问题与this one类似,我对问题的解答大部分都有,但我仍有问题:

首先是C代码:

emcc -o writebmp.js dummyCode\cwrapCall.cxx -s EXPORTED_FUNCTIONS="['_fillArray']"

我将指向数组的指针传递给我的C函数并用一些信息填充它。我用

编译这段代码
<!doctype html>
<html>
  <script src="writebmp.js"></script>
  <script>
    fillArray = Module.cwrap('fillArray', null, ['number', 'number']);
    var nByte = 4
    var length = 20;
    var buffer = Module._malloc(length*nByte);
    fillArray(buffer, length);
    for (var i = 0; i < length; i++)
    {
        console.log(Module.getValue(buffer+i*nByte));
    }
  </script>
</html>

我的html / js代码如下:

1)vi /etc/ssh/sshd_config
#Port 22
Port 2292

2)reboot

当我运行脚本时,我得到的输出是正确的,直到第12个元素,之后它是垃圾。缓冲区I malloc是否太小?

1 个答案:

答案 0 :(得分:3)

Module.getValue接受一个可选的第二个参数,表示“指针”应被解除引用的类型,默认情况下为'i8',这意味着32位有符号整数被解引用为8位整数所以你不会得到垃圾,但要包装错误。

修复这个很简单,你只需要指定传递给Module.getValue的'指针'应该被解引用为32位有符号整数:

console.log(Module.getValue(buffer+i*nByte, 'i32'));

fillArray的声明更改为

可能更安全,更清晰
#include <stdint.h>

void fillArray(int32_t* a, int32_t len)

可以找到emscripten文档的重要部分here