我是Emscripten/javascript以及此Overstack社区的新手。如果我的情况已经得到解决,我很抱歉。如何处理传递/返回数组指针到emscripten编译的代码?
从Windows 7的环境中,我使用EMCC编译它接受一个数组并修改它(见下文)一个简单的C程序。
double* displayArray(double *doubleVector) {
for (int cnt = 0; cnt < 3; cnt++)
printf("doubleVector[%d] = %f\n", cnt, doubleVector[cnt]);
doubleVector[0] = 98;
doubleVector[1] = 99;
doubleVector[2] = 100;
for (int cnt1 = 0; cnt1 < 3; cnt1++)
printf("modified doubleVector[%d] = %f\n", cnt1, doubleVector[cnt1]);
return doubleVector;
}
int main() {
double d1, d2, d3;
double array1[3];
double *array2;
array1[0] = 1.00000;
array1[1] = 2.000000;
array1[2] = 3.000000;
array2 = displayArray(array1);
for (int cntr =0; cntr < 3; cntr++)
printf("array1[%d] = %f\n", cntr, array1[cntr]);
for (int cnt = 0; cnt < 3; cnt++)
printf("array2[%d] = %f\n", cnt, array2[cnt]);
return 1;
}
使用em选项的-o选项,我生成了一个加载到浏览器(Chrome)的.html文件。
python emcc displayArray7.c -o displayArray7.html -s EXPORTED_FUNCTIONS="['_main', '_displayArray'
加载后,我看到在浏览器窗口中生成的输出如预期的那样(见下文)。
doubleVector[0] = 1.000000
doubleVector[1] = 2.000000
doubleVector[2] = 3.000000
modified doubleVector[0] = 98.000000
modified doubleVector[1] = 99.000000
modified doubleVector[2] = 100.000000
array1[0] = 98.000000
array1[1] = 99.000000
array1[2] = 100.000000
array2[0] = 98.000000
array2[1] = 99.000000
array2[2] = 100.000000
但是,在使用时module.cwrap()经由命令JavaScript控制台并试图直接调用函数(外的主()),
> displayArray=Module.cwrap('displayArray', '[number]', ['[number]'])
> result = displayArray([1.0,2.0,3.0])
[1, 2, 3]
> result
[1, 2, 3]
我看到正在生成以下/显示在浏览器中,这不是我期望看到的。
doubleVector[0] = 0.000000
doubleVector[1] = 0.000000
doubleVector[2] = 0.000000
modified doubleVector[0] = 100.000000
modified doubleVector[1] = 100.000000
modified doubleVector[2] = 100.000000
我有以下问题:
我是否有语法正确的返回类型和参数列表正确,我呼吁Module.cwrap()?我已经成功地运行与传递非指针变量的int_sqrt()常规交易的教程“与代码交互”一节中int_sqrt()的简单,直接的例子。
有什么不同的,当数组和/或指针传递给(或返回)emscripten生成的JavaScript代码,是怎么回事?
如何的是,在该函数的浏览器所生成的输出,displayArray(),工程(如预期)从主调用时();但不是通过JavaScript控制台?
我是新来的Emscripten/JavaScript所以任何信息/援助将不胜感激。
谢谢
FC
非常有用的答案。节省我几小时的拉毛。谢谢。 – scai
确实非常有帮助,但是“相反”呢?如何从C代码修改数组并在Javascript中使用它? – gromit190
我看到一个'Module.malloc()'但没有'Module.free()'?它是由JS的GC处理的吗? – Nikkolasg