Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.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
为什么这个C代码不能在JavaScript中工作?_Javascript_C - Fatal编程技术网

为什么这个C代码不能在JavaScript中工作?

为什么这个C代码不能在JavaScript中工作?,javascript,c,Javascript,C,因为我不精通C语言,所以我尝试了第二个C语言中矩阵转换的例子,简单地转换成JavaScript(下面的代码)。它冻结了浏览器 有人能帮我理解是什么导致了这个问题吗?C程序在ideone中运行良好 正如Nirk善意地指出的那样,C程序中的除法是整数而不是浮点,因此如果不使用Math.floor,循环就不会终止 C代码: #include <stdio.h> void transpose(double *m, int w, int h) { int start, next, i;

因为我不精通C语言,所以我尝试了第二个C语言中矩阵转换的例子,简单地转换成JavaScript(下面的代码)。它冻结了浏览器

有人能帮我理解是什么导致了这个问题吗?C程序在ideone中运行良好

正如Nirk善意地指出的那样,C程序中的除法是整数而不是浮点,因此如果不使用
Math.floor
,循环就不会终止

C代码:

#include <stdio.h>

void transpose(double *m, int w, int h)
{
  int start, next, i;
  double tmp;

  for (start = 0; start <= w * h - 1; start++) {
    next = start;
    i = 0;
    do {    i++;
      next = (next % h) * w + next / h;
    } while (next > start);
    if (next < start || i == 1) continue;

    tmp = m[next = start];
    do {
      i = (next % h) * w + next / h;
      m[next] = (i == start) ? tmp : m[i];
      next = i;
    } while (next > start);
  }
}
#包括
无效转置(双*m,整数w,整数h)
{
int start,next,i;
双tmp;
对于(开始=0;开始);
如果(next开始);
}
}
JavaScript代码:

function transpose(m, w, h)
{
  var start, next, i,
      tmp

  for (start = 0; start <= w * h - 1; start++) {
    next = start
    i = 0
    do {    i++
      next = (next % h) * w + next / h
    } while (next > start)
    if (next < start || i == 1) continue

    tmp = m[next = start]
    do {
      i = (next % h) * w + next / h
      m[next] = (i == start) ? tmp : m[i]
      next = i
    } while (next > start)
  }
}

function main()
{
  var j
  var m = []
  for (j = 0; j < 15; j++) m[j] = j + 1

  console.log("before transpose:")
  console.log(m)

  transpose(m, 3, 5)

  console.log("\nafter transpose:")
  console.log(m)
}

main()
函数转置(m,w,h)
{
开始,下一步,我,
tmp
用于(开始=0;开始)
如果(下一步开始)
}
}
函数main()
{
var j
var m=[]
对于(j=0;j<15;j++)m[j]=j+1
log(“转置前:”)
控制台日志(m)
转置(m,3,5)
console.log(“\n转置后:”)
控制台日志(m)
}
main()

除法是浮点,不是整数,因此您需要
数学地板(下一个/h)

任何调试语句来告诉我们它冻结在什么点或可疑变量的值?当然-它在
转置
函数期间冻结…因此,可能不是问题的直接根源,但您应该仔细阅读JS推荐的代码样式。最好使用分号和大括号(
{
)内联。对于等待者--
关于您编写的代码问题的问题必须描述特定的问题--
--当您不知道特定的问题时该怎么办…?对于等待者--还有一件事-我描述了特定的问题-浏览器冻结-并包含了有效的代码来重现它。共有100个如果不是成千上万的问题,那就是关于各种编码错误以及如何纠正这些错误。虽然这个问题的听众可能很少,但一些人似乎对此感兴趣(从评论和投票中可以看出)。我从答案中学到了一些有趣的东西。我还编辑了这个问题(在“暂停”之前添加单词“整型”、“浮点型”和“除法”,供可能搜索此类术语的人使用。一些小技巧也可以使用,例如:
((next/h)|0)
。对于负数有不同之处,但速度会快一点。@TedHopp虽然在这种情况下有效,但在处理大于
Math.pow(2,32)
的数字时,技巧不起作用。例如,
((Math.pow(2,33)+1.3)|0)===1
@Nirk-对。我不是有意建议在所有情况下都这样做。但是,OP移植了使用
int
值的C代码,因此2^32在这里不是一个现实的问题。而且,即使
Math.floor
在超过2^53之后也将是近似值(当64位IEEE浮点表示中的有效位用完时)。(但它的工作效果要比我的
|0
hack好得多。)