Как обернуть или вызвать функцию C с void в качестве возврата в Emscripten?

В вики Emscripten (Взаимодействие с кодом) есть только два типа перечисленные в качестве возможных типов возвращаемых значений для передачи в ccall или cwrap ("число" и "строка"). Как я могу обернуть/вызвать функцию, которая ничего не возвращает (пустой тип возврата)?


person jplatte    schedule 26.06.2014    source источник
comment
undefined является концептуальным эквивалентом.   -  person The Paramagnetic Croissant    schedule 26.06.2014
comment
После успешного использования cwrap с null в качестве возвращаемого типа я попробовал то же самое с undefined, и, похоже, он тоже работает.   -  person jplatte    schedule 27.06.2014


Ответы (2)


"null" работает как возвращаемый тип для функций void вместо строки.

Например:

    my_fun = Module.cwrap('my_fun', null, ['number', 'number']);
person Charles Ofria    schedule 26.06.2014

Примеры на сайте также используют number, так как это будет просто игнорируется. Это то, что использует пример в вики.

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


Например, функция C

void test(char* buffer, int buffersize) {
  // ...
}

может быть обернут как

var test = Module.cwrap('test', 'number', ['number', 'number']);
person zzmp    schedule 26.07.2014
comment
Спасибо, что указали мне на каталог примеров! Я не знал, что он существовал раньше. - person jplatte; 28.07.2014
comment
Что касается всех этих «числовых» элементов: я думаю, что для возвращаемого типа я буду придерживаться null или undefined, вставлять «число» туда просто не имеет смысла. Однако мне любопытен этот первый параметр: зачем вручную выделять пространство с помощью Module._malloc, а затем передавать указатель на функцию-оболочку вместо того, чтобы просто использовать «строку» в качестве типа параметра? - person jplatte; 28.07.2014
comment
Я не могу дать вам окончательный ответ, но я могу определенно рискнуть предположить: возможно, он был написан до того, как «строка» стала вещью, но, скорее всего, этот пример лучше проверяет его и демонстрирует более общие методы прохождения, так как тесты часто упоминаются (в вики) в качестве примеров. - person zzmp; 28.07.2014