Я новичок в Emscripten/javascript, а также в этом сообществе Overstack. Я заранее извиняюсь, если моя ситуация уже решена.
В среде 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;
}
Используя опции -o для emcc, я сгенерировал файл .html, который я загрузил в браузер (Chrome).
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 и попытке вызвать функцию напрямую (вне 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?
Я новичок в Emscripten/javascript, поэтому вся информация/помощь будут очень благодарны.
Спасибо,
ФК