Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么可以';我是否在ASM.js中使用32位整数数组?_Javascript_Firefox_Emscripten_Arraybuffer_Asm.js - Fatal编程技术网

Javascript 为什么可以';我是否在ASM.js中使用32位整数数组?

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

这段代码在Firefox中运行得很好——尽管出于某种原因,将Uint8Array更改为Uint32array会中断。在这种情况下,我需要以不同的方式强制数字吗

 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”。