Я планирую использовать существующую библиотеку c в Интернете с помощью веб-сборки.
Ниже приводится суть функции библиотеки, которую я не имею никакого контроля над программой
#include <stdio.h>
#include <stdlib.h>
int avg(int size, double const *const *inputs, double const *options, double *const *outputs) {
const double *input = inputs[0];
const int period = (int)options[0];
double *output = outputs[0];
const double scale = 1.0 / period;
double sum = 0;
int i;
for (i = 0; i < period; ++i) {
sum += input[i];
}
*output++ = sum * scale;
for (i = period; i < size; ++i) {
sum += input[i];
sum -= input[i-period];
*output++ = sum * scale;
}
return 0;
}
Для третьего аргумента *options
, передавая массив I обычно Module._malloc()
и отправляя указатель памяти после установки всех необходимых значений в этом месте указателя памяти, как показано ниже, и он отлично работает
var optionsPointer = Module._malloc(options_required.length * 64);
var optionsValues = new Float64Array(Module.wasmMemory.buffer, optionsPointer, options_required.length);
optionsValues.set(option_values);
Но как бы я отправлял параметры типа double const *const *inputs
(второй) и double *const *outputs
(последний) аргументы. Я попытался создать массив указателей указателя, как показано ниже для второго аргумента, но безуспешно.
var inputMemoryPointer = Module._malloc(size * 64);
var inputMemoryValues = new Float64Array(Module.wasmMemory.buffer, inputMemoryPointer, size);
inputMemoryValues.set(user_inputs[input]);
var inputsPointer = Module._malloc(64)
var inputsValues = new Float64Array(Module.wasmMemory.buffer, inputsPointer, 1);
inputsValues.set([inputMemoryPointer]);
Я использую emscripten для создания wasm и оболочки javascript, если это поможет.