Как использовать 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 нет указателей. Надеюсь, у вас есть идеи по этому поводу?

0 ответов

Другие вопросы по тегам