Вызов функции веб-сборки C с использованием const * const * входных данных из javascript - PullRequest
0 голосов
/ 12 ноября 2018

Я планирую использовать существующую библиотеку 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, если это поможет.

1 Ответ

0 голосов
/ 12 ноября 2018

inputsValues должен быть Uint32Array, а не Float64Array;указатели - это 32-разрядные целые числа без знака в emscripten.

Также дважды проверьте размеры ваших выделений;Я заметил, что вы выделяете 64 байта для массива указателей inputs, в котором есть место для 16 указателей, но только для установки одного.(Если предполагается, что для каждой итерации должно быть 16 элементов, то это нормально, если ваш реальный код устанавливает другие элементы.)

...