Javascript 为什么可以';我是否在ASM.js中使用32位整数数组?
这段代码在Firefox中运行得很好——尽管出于某种原因,将Uint8Array更改为Uint32array会中断。在这种情况下,我需要以不同的方式强制数字吗Javascript 为什么可以';我是否在ASM.js中使用32位整数数组?,javascript,firefox,emscripten,arraybuffer,asm.js,Javascript,Firefox,Emscripten,Arraybuffer,Asm.js,这段代码在Firefox中运行得很好——尽管出于某种原因,将Uint8Array更改为Uint32array会中断。在这种情况下,我需要以不同的方式强制数字吗 function Module(stdlib, foreign, heap) { "use asm"; // Variable Declarations var els = new stdlib.Uint8Array(heap); // Function Declarations
function Module(stdlib, foreign, heap) {
"use asm";
// Variable Declarations
var els = new stdlib.Uint8Array(heap);
// Function Declarations
function firstn(x) {
x = x|0 //32-bit (int)
var i=0;
for (; (i|0) < (x|0); i = (i+1)|0) {
els[i] = i;
}
}
return { firstn: firstn };
}
buf = ArrayBuffer(1024*8)
f = Module(window,{},buf).firstn;
f(5)
console.log(new Uint8Array(buf));
功能模块(stdlib、外部、堆){
“使用asm”;
//变量声明
var els=新的stdlib.Uint8Array(heap);
//函数声明
函数firstn(x){
x=x | 0//32位(整数)
var i=0;
对于(;(i | 0)<(x | 0);i=(i+1)| 0){
els[i]=i;
}
}
返回{firstn:firstn};
}
buf=ArrayBuffer(1024*8)
f=模块(窗口,{},buf).firstn;
f(5)
日志(新的Uint8Array(buf));
还有一件事,是否可以发送一个数组缓冲区,并引用它产生的最终数组,用C++ EnScript编译的AsM.js也?
< P>它看起来像as.js只允许使用表单(Foo> 2)的表达式将索引编入一个32位数组或UIT32数组,尽管在该规范中找不到任何引用。它假定您拥有的是一个地址,并试图在该地址查找整数。我想这是有道理的,因为C代码是这样的:int32_t arr[5];
arr[i];
将被编译成与*((char*)arr+4*i)
等效的机器代码。。。无论如何,将代码中的els[i]=i
替换为:
els[(i<<2)>>2] = i;
els[(i2]=i;
似乎可以使用UINT32阵列工作。到底是什么问题?两个UINT8阵列调用站点中的哪一个正在更改为UINT32阵列?或者您正在同时更改它们?当我将UINT8阵列更改为UINT32阵列时,它无法编译-可能是因为需要使用不同的类型。谢谢!太好了,您是如何发现的?我不知道加倍和减半如何解决这个问题——奇怪的是,当我像这样使用斐波那契计算时,
els[(i2]=(els[(I-1)2]+els[(I-2)2])|0
我是通过查找所涉及的验证错误消息,然后读取周围的代码找到它的。我知道这不是一个完全友好的过程。至于Fibonacci,看起来需要将数组读取的结果显式转换为int,如下所示:els[(i2]=(els[(I-1)>2]| 0)+(els[(I-2)>2]|0)
。我不知道为什么不能假定UINT32数组读取的类型是“unsigned”;它认为类型是“intish”。