使用 emscripten 将数组传递给 C 函数
Pass array to C function with emscripten
我认为这个问题与 this one 类似,我使用了其中的大部分答案来解决我的问题,但我仍然有问题:
首先是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的buffer是不是太小了?
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 文档的相关部分 here
我认为这个问题与 this one 类似,我使用了其中的大部分答案来解决我的问题,但我仍然有问题:
首先是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的buffer是不是太小了?
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 文档的相关部分 here