簡體   English   中英

使用javascript的const * const * input調用C webassembly函數

[英]Calling C webassembly function with const *const *inputs from javascript

我打算使用webassembly在網絡上使用現有的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 ,我通常使用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 (second)和double *const *outputs (last)參數這樣的參數。 我嘗試為第二個參數創建如下的指針的指針數組,但沒有成功。

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包裝器(如果有幫助)。

inputsValues應該是Uint32Array,而不是Float64Array; 指針是emscripten中的32位無符號整數。

還要仔細檢查分配的大小; 我注意到您為指針的inputs數組分配了64個字節,該空間可容納16個指針,但只能設置一個。 (如果每次迭代有16個項目,那很好,只要您的實際代碼設置其他項目即可。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM