Je voudrais tester WebAssembly pour effectuer des calculs de tableau complexes.Passer un tableau JavaScript en tant qu'argument à une fonction WebAssembly
J'ai écrit une simple fonction C++ ajouter deux int
tableaux contenant 3 éléments chacun:
// hello.cpp
extern "C" {
void array_add(int * summed, int* a, int* b) {
for (int i=0; i < 3; i++) {
summed[i] = a[i] + b[i];
}
}
}
Et compilé cela avec:
emcc hello.cpp -s WASM=1 -s "MODULARIZE=1" -s "EXPORT_NAME='HELLO'" -s "BINARYEN_METHOD='native-wasm'" -s "EXPORTED_FUNCTIONS=['_array_add']" -o build/hello.js
qui génère entre autres, une js
et un fichier wasm
. Je charge ceux-ci avec la page HTML suivante:
<!doctype html>
<html lang="en-us">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script type="text/javascript" src="build/hello.js"></script>
<script type="text/javascript">
function reqListener() {
// Loading wasm module
var arrayBuffer = oReq.response
HELLO['wasmBinary'] = arrayBuffer
hello = HELLO({ wasmBinary: HELLO.wasmBinary })
// Calling function
var result = new Int32Array(3)
var a = new Int32Array([1, 2, 3])
var b = new Int32Array([4, 5, 2])
hello._array_add(result, a, b)
console.log('result', result)
}
var oReq = new XMLHttpRequest();
oReq.responseType = "arraybuffer";
oReq.addEventListener("load", reqListener);
oReq.open("GET", "build/hello.wasm");
oReq.send();
</script>
</head>
<body>
</body>
</html>
Mais en quelque sorte, le tableau est toujours result
[0, 0, 0]
.
J'ai essayé une variété de choses, y compris l'appel de la fonction avec ccall()
(voir emscripten docs) et il semble que je ne peux pas obtenir un tableau passé en argument de ma fonction wasm compilé.
Par exemple, la fonction C++ suivante:
extern "C" {
int first(int * arr) {
return arr[0];
}
}
Résultat lorsqu'il est appelé dans JavaScript est un entier aléatoire à la rigueur, au lieu de la valeur prévue à partir du tableau I en tant qu'argument.
Qu'est-ce qui me manque?
NB: Je ne sais rien à peu près sur le C++, donc toutes mes excuses si cela est une question débutant liée à l'ignorance de mon C ...