Saya hanya menggunakan kode seperti Contoh MDN untuk mengakses memori dari AS dan JS.
Tetapi kecuali u8/i8, semua pola pengujian gagal dan saya melihat data yang ditampilkan oleh JS berbeda dari yang ditunjukkan oleh AS.
Bagaimana saya bisa menyimpan data dalam float?
Kode saya seperti:
```index.ts
// perakitan/indeks.ts
fungsi ekspor readMemoryU8(offset: gunakan): u8 {
beban kembali
}
fungsi ekspor writeMemoryU8(offset: penggunaan, nilai: u8): void {
toko
}
fungsi ekspor readMemoryU16(offset: gunakan): u16 {
beban kembali
}
fungsi ekspor writeMemoryU16(offset: penggunaan, nilai: u16): void {
toko
}
fungsi ekspor readMemoryF64(offset: gunakan): f64 {
beban kembali
}
fungsi ekspor writeMemoryF64(offset: penggunaan, nilai: f64): void {
toko
}
// ...
```index.js
// index.js
const fs = require("fs");
const compiled = new WebAssembly.Module(fs.readFileSync(__dirname + "/build/optimized.wasm"));
const imports = {};
Object.defineProperty(module, "exports", {
get: () => new WebAssembly.Instance(compiled, imports).exports
});
```index.test.js
// __tests__/index.test.js
const wasm = membutuhkan('../index');
memori const = wasm.memory;
deskripsikan('Uji WASM', () => {
sebelumSemua(() => {
const mem = new Uint8Array(memory.buffer);
if (mem.panjang < 1) {
memori.tumbuh(1);
}
wasm.memory.grow(1);
});
test('baca / tulis uint8', () => {
const mem = new Uint8Array(memory.buffer);
mem.set([1, 3, 5]);
console.log([0, 1, 2, 3, 4, 5].map(wasm.readMemoryU8));
// [ 1, 3, 5, 0, 0, 0 ]
console.log(mem.subarray(0, 6));
//Uint8Array [ 1, 3, 5, 0, 0, 0 ]
expect(wasm.readMemoryU8(1)).toBe(3);
wasm.writeMemoryU8(1, 6);
expect(wasm.readMemoryU8(1)).toBe(6);
expect(mem[1]).toBe(6);
expect(wasm.readMemoryU8(0)).toBe(1);
expect(wasm.readMemoryU8(2)).toBe(5);
});
test('baca / tulis uint16', () => {
const mem = new Uint16Array(memory.buffer);
mem.set([1, 3, 257]);
console.log([0, 1, 2, 3, 4, 5].map(wasm.readMemoryU16));
// [ 1, 768, 3, 256, 257 ]
console.log(mem.subarray(0, 6));
// Uint16Array [ 1, 3, 257, 0, 0, 0 ]
expect(wasm.readMemoryU16(0)).toBe(1);
expect(wasm.readMemoryU16(1)).toBe(3); // failed
wasm.writeMemoryU16(1, 6);
expect(wasm.readMemoryU16(1)).toBe(6);
expect(mem[1]).toBe(6);
expect(wasm.readMemoryU16(2)).toBe(5);
});
test('baca / tulis float64', () => {
const mem = new Float64Array(memory.buffer);
mem.set([1, -3.2, 25.8]);
console.log([0, 1, 2, 3, 4, 5].map(wasm.readMemoryF64));
// [ 1,
// -3.0065162379579438e-182,
// -2.413170169815393e-185,
// -2.3536706995205933e-185,
// -2.3534382797147542e-185,
// -2.3534373718248877e-185 ]
console.log(mem.subarray(0, 6));
// Float64Array [ 1, -3.2, 25.8, 0, 0, 0 ]
expect(wasm.readMemoryF64(0)).toBe(1);
expect(wasm.readMemoryF64(1)).toBe(-3.2); // failed
wasm.writeMemoryI16(1, -6.5);
expect(wasm.readMemoryF64(1)).toBe(-6.5);
expect(mem[1]).toBe(-6.5);
expect(wasm.readMemoryI16(2)).toBe(25.8);
});
});
```
Sepertinya kenaikan selalu 1
untuk offset, yang benar untuk nilai 8-bit, tetapi harus 2
untuk 16-bit dan 4
untuk nilai 32-bit dll., di sini menghasilkan situasi di mana nilai saling menimpa.
@dcodeIO
Itulah masalahnya. ketika store<f64>(0, 1.5)
, maka store<f64>(1, 2.7)
, Saat ini load<f64>(0)
akan mengembalikan nilai yang aneh. Tetapi load<f64>(1)
akan mengembalikan 2.7
.
offset
dalam kasus Anda adalah posisi memori yang tepat, tetapi Anda melewati indeks, yang perlu dikalikan. Saat menggunakan f64
, Anda harus menambah offset sebesar 8
byte (ini adalah nilai 64-bit) sehingga nilainya tidak saling menimpa, mis.
export function readMemoryF64(index: u32): f64 {
return load<f64>(index << alignof<f64>());
}
export function writeMemoryF64(index: u32, value: f64): void {
store<f64>(index << alignof<f64>(), value);
}
@dcodeIO
Tes lulus!
Terima kasih banyak!
Komentar yang paling membantu
offset
dalam kasus Anda adalah posisi memori yang tepat, tetapi Anda melewati indeks, yang perlu dikalikan. Saat menggunakanf64
, Anda harus menambah offset sebesar8
byte (ini adalah nilai 64-bit) sehingga nilainya tidak saling menimpa, mis.