如何从WebAssembly函数返回JavaScript字符串?
以下模块可以用C(++)编写吗?
export function foo() {
return 'Hello World!';
}
Run Code Online (Sandbox Code Playgroud)
另外:我可以将它传递给JS引擎进行垃圾回收吗?
我有一个生锈的项目,我正在编写webasm每http://asquera.de/blog/2017-04-10/the-path-to-rust-on-the-web/
项目编译.当我在Chrome Canary中运行它时,内存不足并给我一个非常有用的错误消息:
abort("Cannot enlarge memory arrays. Either (1) compile with -s
TOTAL_MEMORY=X with X higher than the current value 16777216, (2) compile
with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime,
...
Run Code Online (Sandbox Code Playgroud)
问题是,它不清楚如何将这些标志传递给rustc /构建工具链.
既未设置EMMAKEN_CFLAGS,也未设置以下工作:
cargo rustc -v --target=wasm32-unknown-emscripten --release -- -Clink-args="-s TOTAL_MEMORY=33554432"
Run Code Online (Sandbox Code Playgroud) 在javascript中,使用"整数"参数除零就像浮点一样:
1/0; // Infinity
-1/0; // -Infinity
0/0; // NaN
Run Code Online (Sandbox Code Playgroud)
asm.js规范说,返回带有整数参数的除法intish,必须立即强制转换为有符号或无符号.如果我们在javascript中执行此操作,则使用"整数"参数除零始终在coersion后返回零:
(1/0)|0; // == 0, signed case.
(1/0) >> 0; // == 0, unsigned case.
Run Code Online (Sandbox Code Playgroud)
但是,在具有Java和C等实际整数类型的语言中,将整数除以零是一个错误,执行会以某种方式停止(例如,抛出异常,触发陷阱等).
这似乎也违反了asm.js指定的类型签名.的类型的Infinity和NaN是double与/是假想(从规格):
(签名,签名)→intish∧(无符号,无符号)→intish∧(double?,double?)→double∧(float?,float?)→floatish
但是,如果其中任何一个具有零分母,结果是double,所以看起来类型只能是:
(双?,双?)→双
在asm.js代码中会发生什么?它是否遵循javascript并返回0或除零产生运行时错误?如果它遵循javascript,为什么键入错误是正确的?如果它产生运行时错误,为什么规范没有提到呢?
我想了解 Rust 程序在编译为 wasm 文件时实际导出的内容,以便我可以importObject为实例化函数提供有效的值:
WebAssembly.instantiate(bufferSource, importObject);
Run Code Online (Sandbox Code Playgroud)
据我了解,执行此操作的唯一方法是导出已编译代码的类似 s 语法的文件。我无法在他们的文档中或通过网络搜索找到如何执行此操作。
没有使用indirect_call在线可用的示例。根据语义文档,我尝试了
(call_indirect
(i32.const 0)
(i32.const 0)
)
Run Code Online (Sandbox Code Playgroud)
数字是随机的,但是没有给出我期望的运行时错误。我正在解析错误。
正确的语法是call_indirect什么?
考虑以下C++:
int MYVAR = 8;
Run Code Online (Sandbox Code Playgroud)
它将从Clang/LLVM编译到插入下面操场的WASM字节码.
为了便于阅读:
(module
(table (;0;) 0 anyfunc)
(memory (;0;) 1)
(global (;0;) i32 (i32.const 0))
(export "MYVAR" (global 0))
(data (i32.const 0) "\08\00\00\00"))
Run Code Online (Sandbox Code Playgroud)
当从js调用时,MYVAR将公开指向变量的指针.
但是如何使用新的js API访问实际内存?
内存构造函数似乎在初始化时删除了条目,但我不确定我是否正确地解释了这一点.
作为旁注,模块没有规范中指定的exports属性,但这也可能是一种误解.
操场:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>MEMORY ACCESS TEST</title>
</head>
<div>
<h1 style="display: inline;">MEMORY LOCATION : </h1>
<h1 id='POINTER' style="display: inline;"></h1>
</div>
<div>
<h1 style="display: inline;">VALUE : </h1>
<h1 id='VALUE' style="display: inline;"></h1>
</div>
<body>
<script>
var bytecode = new Uint8Array([
0x00, 0x61, …Run Code Online (Sandbox Code Playgroud) 有人可以分享一下静态创建具有某些元素的表并引用它的语法吗?我找不到任何这样做的网络汇编代码。
还有一些细节,例如我可以有多个列,如果索引不在表中会发生什么等,会有帮助吗?
我知道iterator可以用于vectorwithstd::vector::begin或 withstd::begin中定义的<iterator>。对于 也一样std::end。我还可以将迭代器与 C 数组一起使用吗?我尝试了以下方法,但没有成功。
#include <iostream>
#include <iterator>
using std::cin;
using std::cout;
using std::endl;
using std::begin;
using std::end;
void print(const int *arr) {
for (auto cbeg = cbegin(arr); cbeg != cend(arr); ++cbeg) {
cout << *cbeg << endl;
}
}
int main() {
int arr[] = {9, 18, 31, 40, 42};
print(arr);
}
Run Code Online (Sandbox Code Playgroud)
编辑:
我认为我可以做到这一点,因为他们在 C++ 入门中使用了这段代码begin,并end让迭代器到达第一个和最后一个元素:
#include <iterator>
using std::begin; using std::end; …Run Code Online (Sandbox Code Playgroud) 我是VEINS的新手,正在尝试在MyVeinsApp.cc中实现加权p持久性。该公式中使用了发送节点和接收节点之间的距离。我看到了下面的两个功能。
virtual Coord& getSenderPos();
virtual const Coord& getSenderPos() const {return const_cast<WaveShortMessage*>(this)->getSenderPos();}
Run Code Online (Sandbox Code Playgroud)
我应该使用其中一种方法来计算节点之间的距离吗?
请建议最好的方法。
webassembly ×6
c++ ×3
javascript ×3
asm.js ×2
rust ×2
arrays ×1
emscripten ×1
omnet++ ×1
simulation ×1
sumo ×1
veins ×1