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 コードに配列やポインタが渡される (または返される) ときに何か違うことが起こっていますか?
関数 displayArray() のブラウザーで生成された出力は、main() から呼び出されたときに (期待どおりに) 機能します。JavaScriptコンソール経由ではありませんか?