我想測試WebAssembly以進行一些複雜的數組計算。將JavaScript數組作爲參數傳遞給WebAssembly函數
因此,我已經寫了一個簡單的C++函數加入含有每3個元件中的兩個int
數組:
// 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];
}
}
}
並與編譯此:
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
等等產生,一個js
和一個wasm
文件。我加載這些與下面的HTML頁面:
<!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>
但不知何故,result
陣列總是[0, 0, 0]
。
我已經嘗試了各種各樣的東西,包括調用ccall()
(見emscripten docs)函數,似乎我無法獲得作爲我的wasm編譯函數參數傳遞的數組。
例如,用下面的C++函數:在JavaScript調用時
extern "C" {
int first(int * arr) {
return arr[0];
}
}
結果是隨機ISH整數,而不是從本人送出的參數陣列的預期值。
我錯過了什麼?
NB:我知道C++幾乎什麼都沒有,所以一切道歉,如果這是與我的C++的無知初學者的問題...