Как использовать векторы (из C ++ STL) с WebAssembly - PullRequest
0 голосов
/ 07 мая 2018
#include <iostream>
#include<vector>
using namespace std;

vector<int> ver;

int pushData(int n)
{
    for(int i=0;i<n;i++)
    {
        ver.push_back(i);
    }
}

Я хочу вызвать функцию pushData из JS и передать некоторые данные в вектор "ver" и использовать их позже. объясните, пожалуйста, как это сделать с помощью WebAssembly.

Ответы [ 2 ]

0 голосов
/ 14 августа 2019

Я делаю что-то вроде тебя. На мой взгляд, использование STL в WASM очень сложно.

Мое решение заключается в создании имитирующего вектора. Wasm поддерживает только int32, int64, float32 и float64, а адрес wasm отличается от другого процесса. Так что напрямую импортировать библиотеку не представляется возможным. Вы можете вызвать библиотечную функцию через прокси или конвертацию. Или вы можете написать ее самостоятельно.

В этом случае vector не может быть импортирован напрямую. Вы можете создать класс с именем vector и реализовать функцию push_back.

class vector{
public:
    bool push_back(int i){
       // do something
    }
    int& at(uint index){
       // do something
    }
private:
    int* int_ptr;
}

Подробнее здесь https://aransentin.github.io/cwasm/

0 голосов
/ 21 июля 2018

Я попытался ответить на ваш вопрос, используя этот ответ: https://stackoverflow.com/a/46748966/544721

для принятия решения:

#include<vector>
const int SIZE = 10;
std::vector<int> data(10);

void add(int value) { 
  for (int i=0; i<SIZE; i++) {
    data[i] = data[i] + value;
  }
}

int* getData() {
  return &(data[0]);
}

и js:

var wasmModule = new WebAssembly.Module(wasmCode);
var wasmInstance = new WebAssembly.Instance(wasmModule, wasmImports);

var offset = wasmInstance.exports.getData();

var linearMemory = new Uint32Array(wasmInstance.exports.memory.buffer, offset, 10);
for (var i = 0; i < linearMemory.length; i++) {
  linearMemory[i] = i;
}

wasmInstance.exports.add(10);

for (var i = 0; i < linearMemory.length; i++) {
  log(linearMemory[i]);
}

WasmFiddle: https://wasdk.github.io/WasmFiddle//?wuycy

Но похоже, что есть какая-то ошибка компоновщика:

line 2: Uncaught LinkError: WebAssembly Instantiation: Import #9 module="env" function="__dso_handle" error: global import must be a number

Может ли кто-нибудь помочь заставить этот код C ++ работать в WasmFiddle?

...