Передача указателя на WebAssembly из JavaScript, который работает некорректно - PullRequest
0 голосов
/ 19 июня 2020

Ниже приведен мой код JavaScript.

  a = "hello"

  a_ascii = [];
  for (var i = 0; i < a.length; i ++)
    a_ascii.push(a[i].charCodeAt(0));

  a_typedArray = new Float32Array(a_ascii.length)
  for (let i=0; i<a_ascii.length; i++) {
    a_typedArray[i] = a_ascii[i]
  }
  a_buffer = Module._malloc(a_typedArray.length * a_typedArray.BYTES_PER_ELEMENT)

  Module.HEAPF32.set(a_typedArray, a_buffer >> 2)

  var result = Module.ccall(
      "myFunction", // name of C function
      null, // return type
      [Number, Number], // argument types
      [a_buffer, a.length] // arguments
  );

И ниже приведен код C:

extern "C"
{
    void EMSCRIPTEN_KEEPALIVE myFunction(int *a, int s)
    {
        printf("MyFunction Called\n");
        for (int i = 0; i < s; i++) {
            printf("%d ", a[i]);
        }
        printf("\n%d\n", s);
    }

}

Вывод кода C приведен ниже :

1120927744 1120534528 1121452032 1121452032 1121845248

5

хотя должно было быть:

104 101 108 108 111

5

Пожалуйста, дайте мне знать, что не так с кодом.

Я взял ссылку из: ссылка

1 Ответ

1 голос
/ 19 июня 2020

Вы используете Float32Array в JavaScript, а int* в C.

Вы должны выполнить одно из:

  • Замените Float32Array на Int32Array в своем коде JavaScript
  • Измените int* на float* и "%d " на "%.0f " в своем C коде
...