emcc/wasm/SIDE_MODULE/javascript - новичок - с использованием глобальной переменной

Я новичок в emscripten, emcc и javascript.

Мой первый обучающий эксперимент - создать веб-страницу с одной кнопкой ("щелкните по ней"), которая при каждом нажатии вызывает диалоговое окно (функция предупреждения javascript), показывающее целое число, и для каждого щелчка целое число увеличивается (следовательно, я считаю необходимость хранить значение целого числа от одного щелчка до другого, предположительно как глобальную переменную).

Я начал с очень простого примера использования wasm в SIDE_MODULE, используя такую ​​добрую работу:

WebAssembly - использование Emscripten для создания базового модуля

В данном примере HTML-файла потребовалось одно небольшое изменение: alert(gModule.exports.add(1,2)); (изменено._add на.add), и с этим изменением указанный пример работал так, как предполагалось (всплывает диалоговое окно с предупреждением, показывающее "3") каждый раз, когда нажимается кнопка.)

В этом примере показана веб-страница с одной кнопкой, и при нажатии кнопки сообщение в диалоговом окне предупреждения представляет собой сумму двух целых чисел. Консоль (firefox) не показывает сообщений ни во время загрузки страницы, ни во время нажатия кнопки. Я использовал этот рабочий пример как отправную точку.

(Однострочный) модуль из приведенного выше примера:

int add(int x, int y) { return x+y; }

и модуль компилируется из исходного кода (имя файла 1.c) в wasm (имя файла 1.wasm) с использованием:

emcc 1.c -s WASM=1 -s SIDE_MODULE=1 -O1 -o 1.wasm

Соответствующий html-файл (извините, я, возможно, не включил этот файл должным образом, и встроенный боттон stackexchange, вероятно, не даст никаких полезных результатов):

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8"/>
  </head>
  <body>
    <input type="button" value="test 1.wasm 1" onclick="javascript:OnClickTest();" />
    <script type="text/javascript">
      var gModule = null;
      var importObject = {
        'env': {
          'memoryBase': 0,
          'tableBase': 0,
          'memory': new WebAssembly.Memory({initial: 256}),
          'table': new WebAssembly.Table({initial: 0, element: 'anyfunc'})
        }
      };
      fetch('http://localhost/1.wasm').then(response =>
        response.arrayBuffer()
      ).then(bytes =>
        WebAssembly.instantiate(bytes, importObject)
      ).then(results => {
        gModule = results.instance; // Hold onto the module's instance so that we can reuse it
      });
      function OnClickTest(){
        <!-- alert("alert"); -->
        <!-- the underscore was removed alert(gModule.exports._add(100, 200));  -->
        alert(gModule.exports.add(100, 200));
      }
    </script>
  </body>
</html>
~        

Я попытался добавить глобальную переменную в (теперь двухстрочный) модуль языка c, предполагая, что каждый раз, когда нажимается кнопка, я получаю увеличивающееся значение:

int global=0;
int add(int x, int y) { global++; return global; }

Когда я открываю html-страницу, я получаю сообщение в консоли браузера (firefox):

LinkError: поле объекта импорта 'g$global' не является функцией

и когда я нажимаю кнопку на странице, я получаю дополнительное сообщение в консоли браузера (firefox):

TypeError: gModule имеет значение null

В идеале я хотел бы понять, как работает веб-страница примера как есть, а затем понять, как изменить или добавить к этому простому примеру для достижения моей цели, поскольку это поможет мне узнать, как модуль wasm взаимодействует с javascript, содержащимся в очень простая веб-страница.

Когда я ищу в этих сообщениях об ошибках, информация, которую я собираю, является слишком общей для моего непосредственного использования и требует большего опыта в этой области, чем у меня сейчас. По этой причине я ищу совета о том, как я (неправильно) подхожу к этой задаче, и на каких концепциях мне нужно сосредоточиться, чтобы продвинуть свои усилия к этой начальной цели.

Спасибо за любые советы.

0 ответов

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