在 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;
}
使用 emcc 的 -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
但是,当通过 javascript 控制台使用 module.cwrap() 命令并尝试直接调用该函数时(在 main() 之外),
> 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 代码(或从其返回)时,是否发生了一些不同的事情?
当从 main() 调用时,函数 displayArray() 在浏览器中生成的输出如何工作(如预期的那样)?但不是通过javascript控制台?