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

7

我认为这个问题类似于这个问题,我已经使用其中的大部分答案解决了我的问题,但我仍然有一些问题:

首先是C代码:

#include <stdio.h>

extern "C"
{
    void fillArray(int* a, int len)
    {
        for (int i = 0; i<len; i++)
        {
            a[i] = i*i;
        }

        for (int j = 0; j < len; ++j)
        {
            printf("a[%d] = %d\n", j, a[j]);
        }
    }
}

我将一个数组的指针传递给我的C函数,并用一些信息填充它。我使用以下代码编译:
emcc -o writebmp.js dummyCode\cwrapCall.cxx -s EXPORTED_FUNCTIONS="['_fillArray']"

我的html/js代码如下:

<!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>

当我运行脚本时,输出结果在前12个元素正确无误,之后的输出结果变得混乱。是我malloc的缓冲区太小了吗?
1个回答

4
< p > Module.getValue 接受一个可选的第二个参数,表示 'pointer' 应该作为何种类型被解引用,默认情况下是 'i8',这意味着 32 位有符号整数被解引用为 8 位整数,因此您不会得到垃圾值,但会出现包裹错误。

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

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

fillArray的声明更改为可能更安全、更清晰:

#include <stdint.h>

void fillArray(int32_t* a, int32_t len)

您可以在这里找到emscripten文档中相关的部分:连接C++和JavaScript


我发现没有getValue - canbax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接