Tôi muốn thử nghiệm WebAssembly để thực hiện một số tính toán mảng phức tạp.Vượt qua một mảng JavaScript làm đối số cho hàm WebAssembly
Vì vậy, tôi đã viết một đơn giản C++ chức năng thêm hai int
mảng chứa 3 yếu tố mỗi:
// 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];
}
}
}
Và biên soạn này vớ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
nào tạo số những người khác, một js
và tệp wasm
. Tôi tải những điều này với các trang html sau:
<!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>
Nhưng bằng cách nào đó, các mảng result
luôn là [0, 0, 0]
.
Tôi đã thử nhiều thứ, bao gồm gọi hàm ccall()
(xem emscripten docs) và có vẻ như tôi không thể nhận được một mảng được truyền làm đối số của hàm được biên dịch của tôi.
Ví dụ, với các chức năng sau C++:
extern "C" {
int first(int * arr) {
return arr[0];
}
}
quả khi gọi trong JavaScript là một số nguyên ngẫu nhiên-ish, thay vì giá trị mong đợi từ các mảng tôi trôi qua như là đối số.
Tôi đang thiếu gì?
NB: Tôi biết khá nhiều gì về C++, vì vậy tất cả lời xin lỗi nếu điều này là một câu hỏi mới bắt đầu liên quan đến C của tôi ++ ngu dốt ...