最近,我尝试使用尽可能少的助手来尝试 WebAssembly。
所以我创建了 ac 项目,包含一些库(stb_image.h
)并尝试编译它。
这是一个简短的可重现示例:
#include <emscripten.h>
#define STBI_NO_STDIO
#define STBI_NO_FAILURE_STRINGS
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
EMSCRIPTEN_KEEPALIVE
void test(){
stbi_load_from_memory(NULL, 0, NULL, NULL, NULL, 0);
}
Run Code Online (Sandbox Code Playgroud)
这是我使用的命令:
emcc converter.c -s STANDALONE_WASM -o converter.wasm --no-entry
这工作正常并给了我一个有效的 wasm 文件。
但后来我尝试使用 javascript 在浏览器中实例化它,而不使用其他任何东西:
let wasm = await Webassembly.instantiateStreaming(fetch('converter.wasm'), {});
Run Code Online (Sandbox Code Playgroud)
但我收到这个错误:
未捕获(承诺中) TypeError: WebAssembly.instantiate(): Import #0 module="wasi_snapshot_preview1" 错误:模块不是对象或函数
我检查了 WebAssembly,确实我的 WebAssembly 需要这些功能:
(func $wasi_snapshot_preview1.fd_close (;0;) (import "wasi_snapshot_preview1" "fd_close") (param i32) (result i32))
(func $wasi_snapshot_preview1.fd_seek (;1;) (import "wasi_snapshot_preview1" "fd_seek") (param i32 i64 i32 …
Run Code Online (Sandbox Code Playgroud) 我正在尝试托管一个网站,并且我使用了一个 .wasm 文件,其中包含由 wasm-pack 工具创建的 .js 脚本。
我使用npm和node.js在本地测试了该项目,一切正常。
但是然后我将它托管在树莓 (apache2) 上,当我尝试访问它时,出现以下错误:
Failed to load module script: The server responded with a non-JavaScript MIME type of "application/wasm". Strict MIME type checking is enforced for module scripts per HTML spec.
有多个文件,但这是一个想法:
我的 index.html 加载模块 bootstrap.js
// bootstrap.js content
import("./index.js").catch(e => console.error("Error importing `index.js`:", e));
Run Code Online (Sandbox Code Playgroud)
我的主要代码在index.js
,它调用test_wasm_bg.js
最后,test_wasm_bg.js
使用以下行加载 wasm 文件:
// test_wasm_bg.js first line
import * as wasm from './test_wasm_bg.wasm';
Run Code Online (Sandbox Code Playgroud)
问题出在哪儿?
加载 Web 程序集文件的正确方法是什么?
我有一个foo
需要 3 个布尔值的函数,我想用每个布尔值组合来获得这个函数的结果。
这是我如何做到的:
fn foo(b1: bool, b2: bool, b3: bool) -> bool {
b1 && b2 || !b3
}
fn main() {
for b1 in vec![false, true] {
for b2 in vec![false, true] {
for b3 in vec![false, true] {
println!("{} {} {} -> {}", b1, b2, b3, foo(b1, b2, b3));
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
有没有比创建向量然后迭代它更直接/更短的方法?
有没有办法用宏或可变函数来做到这一点,这样编译器就可以不迭代地遍历每种情况?
我有一个Couple
带有类型参数的 rust结构
我想对此实施一个操作(Not
在这种情况下)Couple<T>
:如果T
实施Not
,这对夫妇的否定就是否定的夫妇。
use std::ops::Not;
struct Couple<T>(T, T);
impl<T> Not for Couple<T>
where
T: Not,
{
type Output = Self;
fn not(self) -> Self {
Couple(T::not(self.0), T::not(self.1))
}
}
Run Code Online (Sandbox Code Playgroud)
此代码与其他特征(例如 Default::default)一起编译,但不与 trait Not
。
我收到错误
error[E0308]: mismatched types
--> src/lib.rs:12:16
|
5 | impl<T> Not for Couple<T>
| - this type parameter
...
12 | Couple(T::not(self.0), T::not(self.1))
| ^^^^^^^^^^^^^^ expected type parameter `T`, found associated type
|
= note: expected …
Run Code Online (Sandbox Code Playgroud) 我对 c 和 c++ 真的很陌生
我试着用结构来创建一个类似列表的结构,基本上可以包含浮点数和列表。
此代码可编译,但其行为因编译器而异:
使用最新版本的visual studio社区,它输出5
然后0
.
使用在线外壳,我得到5
然后5
当向量通过函数时,我想要得到的第二个。
这是代码:
#include <iostream>
#include <vector>
using namespace std;
struct Box {
Box(char t) {
type = t;
}
union Value {
float number;
vector<Box>* elements;
};
Value value;
char type;
};
Box newBox() {
Box aBox('l');
vector<Box> newVec;
newVec.assign(5, Box('n'));
aBox.value.elements = &newVec;
cout << aBox.value.elements->size() << "\n";
return aBox;
}
int main()
{
Box test = newBox();
cout << …
Run Code Online (Sandbox Code Playgroud) rust ×2
webassembly ×2
apache ×1
boolean ×1
c ×1
c++ ×1
combinations ×1
emscripten ×1
fetch ×1
import ×1
iteration ×1
javascript ×1
mime-types ×1
pointers ×1
struct ×1
traits ×1
types ×1
wasi ×1