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

Phi*_*ipp 7 c arrays emscripten

我认为这个问题与这个问题类似,我使用了它的大部分答案来解决我的问题,但我仍然有问题:

首先是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]);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我将一个指向数组的指针传递给我的 C 函数,并用一些信息填充它。我用以下代码编译这段代码

emcc -o writebmp.js dummyCode\cwrapCall.cxx -s EXPORTED_FUNCTIONS="['_fillArray']"
Run Code Online (Sandbox Code Playgroud)

我的 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>
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*arp 4

Module.getValue采用可选的第二个参数,表示“指针”应取消引用的类型,默认情况下为'i8',这意味着 32 位有符号整数将被取消引用为 8 位整数,因此您不会收到垃圾,而是会出现错误。

解决这个问题很简单,您只需指定传递给的“指针”Module.getValue应作为 32 位有符号整数取消引用:

console.log(Module.getValue(buffer+i*nByte, 'i32'));
Run Code Online (Sandbox Code Playgroud)

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

#include <stdint.h>

void fillArray(int32_t* a, int32_t len)
Run Code Online (Sandbox Code Playgroud)

emscripten 文档的相关部分可以在这里找到