Как использовать C-скомпилированные функции WASM в JS? Логика указателя не работает должным образом
Я использовал EMCC для компиляции программы ac с указателями и импортировал ее в Angular 8 с помощью WebAssembly. Кажется, что функция c доступна в js, но концепция указателя работает не так, как ожидалось. Я полностью сбит с толку, поскольку javascript не использует концепцию указателя. Значит, я должен что-то там сделать.
Ниже моя программа c, я храню числа Фибоначчи в массиве, который принимается как указатель. Также изменил значение символа, изменил его.
#include <emscripten.h>
EMSCRIPTEN_KEEPALIVE
int fibonacci_pointer(int *res, int n, char *ch) {
res[0] = 0;
if(n == 0) { return n; }
res[1] = 1;
if(n == 1) { return n; }
for(int i = 2; i <= n; i++) {
res[i] = res[i-1] + res[i-2];
}
ch = "Bye";
return n;
}
Я скомпилировал файл, используя команду emcc ниже,
emcc \
fibonacci.c \
-Os \
-o fibonacci.wasm \
--no-entry
Я обслужил этот файл WASM через локальный сервер узла. Наконец, в моем приложении Angular 8 в app.component.ts. Я добавил код ниже.
import { AfterViewInit, Component, OnInit } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit, AfterViewInit {
title = 'FrontEnd';
constructor() {}
ngOnInit() {
WebAssembly.instantiateStreaming(window.fetch('http://localhost:3000/fibonacci.wasm'), {
imports: {
imported_func: function(arg) {
console.log(arg);
},
wasi_unstable: () => {}
}
})
.then(async (obj) => {
// Declare variable
// tslint:disable-next-line: prefer-const
let array = []; let n = 8; let str = 'Hi';
// Print to validate of function present
console.log(obj.instance.exports);
// Call the function
const fun: any = obj.instance.exports;
console.log(fun.fibonacci_pointer(array, n, str));
// Print to check if values modified
console.log('Array: ', array, ', N: ', n, ', str: ', str);
// Expected: Array: [0,1,1,....], n: 8, str: Bye
// Got: Array: [], n: 8, str: Hi
})
.catch(err => {
console.log('Unable to get WASM files. Please try again later: ', err);
alert('Unable to get WASM files. Please try again later !');
/* window.history.back(); */
});
}
}
Ниже мое изображение вывода консоли.
Как видите, функция c доступна и отлично работает, поскольку она правильно возвращает значение n. Но логика указателя не работает, потому что массив все еще пуст.
Я ошибся? Я довольно много искал в документации. Говорят, указатели поддерживаются. но это не так. Я знаю, что в javascript нет указателей. Надеюсь, у вас есть идеи по этому поводу?