Я пытался проанализировать строку json в C с помощью библиотеки microjson, а затем скомпилировать ее в wasm с помощью emscripten.Я использовал microjson пример 2, указанный в этой ссылке и добавил только заголовок emscripten.h Я получал ошибки:
LinkError: импортированная память с несовместимым размером
LinkError: импортированная таблица с несовместимым размером
Я преодолеваю эти ошибки, играя с полями начальных и максимальных размеров памяти в моем объекте импорта.Я установил в качестве начального значения памяти 256, максимальное значение 256, начальное значение таблицы 10 и максимальное значение 10. Изменение любого числа (т. Е. Изменение максимального значения таблицы на 11) приводит к появлению второй ошибки, приведенной выше.
В формате wat имеется 24функций, а не 10. Какова магия в этих числах.Вот мой код JavaScript:
`<script>
var memory = new WebAssembly.Memory({ initial: 256, maximum: 256});
let exports = null;
const importObject = {
env: {
table: new WebAssembly.Table({ initial: 10, maximum:10, element: 'anyfunc' }),
__table_base: 0,
memory: memory,
__memory_base: 0,
DYNAMICTOP_PTR: 0,
tempDoublePtr: 0,
abortStackOverflow: () => { throw new Error('overflow'); },
abort: function () { },
_abort: function(){},
_getenv: function(){},
enlargeMemory: function () { },
getTotalMemory: function () { },
abortOnCannotGrowMemory: function () { },
nullFunc_ii: function () { },
nullFunc_iii: function () { },
nullFunc_iiii: function () { },
___lock: function () { },
___setErrNo: function () { },
___syscall140: function () { },
___syscall146: function () { },
___syscall54: function () { },
___syscall6: function () { },
___unlock: function () { },
_emscripten_memcpy_big: function () { },
_emscripten_get_heap_size: function(){},
_emscripten_resize_heap: function(){},
STACKTOP: 0,
STACK_MAX: memory.buffer.byteLength
},
global: {
NaN: NaN,
Infinity: Infinity
}
};
var res;
async function init() {
const wa = await createWebAssembly('json_parser.wasm', importObject);
let exports = wa.instance.exports;
res = exports._parse_json();
console.log(res);
}
init();
async function createWebAssembly(path, importObject) {
const result = await window.fetch(path);
const bytes = await result.arrayBuffer();
return WebAssembly.instantiate(bytes, importObject);
}
</script>`
Это мой код C
`#include <emscripten.h>
#include "mjson.h"
#define MAXCHANNELS 72
static bool usedflags[MAXCHANNELS];
static int PRN[MAXCHANNELS];
static int elevation[MAXCHANNELS];
static int azimuth[MAXCHANNELS];
static int visible;
const struct json_attr_t sat_attrs[] = {
{"PRN", t_integer, .addr.integer = PRN},
{"el", t_integer, .addr.integer = elevation},
{"az", t_integer, .addr.integer = azimuth},
{"used", t_boolean, .addr.boolean = usedflags},
{NULL},
};
const struct json_attr_t json_attrs_sky[] = {
{"class", t_check, .dflt.check = "SKY"},
{"satellites", t_array, .addr.array.element_type = t_object,
.addr.array.arr.objects.subtype=sat_attrs,
.addr.array.maxlen = MAXCHANNELS,
.addr.array.count = &visible},
{NULL},
};
EMSCRIPTEN_KEEPALIVE int parse_json()
{
int i, status = 0;
char js_str[] = "{\"class\":\"SKY\",\"satellites\":"
"[{\"PRN\":10,\"el\":45,\"az\":196,\"used\":true},"
"{\"PRN\":29,\"el\":67,\"az\":310,\"used\":true}]}";
status = json_read_object(js_str, json_attrs_sky, NULL);
return PRN[1];
}`
Как мне скомпилировать код C
emcc -s WASM = 1 json_parser.c mjson.c -o json_parser.js
Этой библиотеки было недостаточно для моих целей, и я переключился на библиотеку nloahmann / json C ++.Все прошло нормально, но опять выдает вторую ошибку.Мое предположение заключается в следующем: что представляет собой этот номер для начального и как я могу его правильно установить?
Мой firefox версии 65.0.1 64-разрядный и версия emscripten 1.38.28