为什么这个C代码不能在JavaScript中工作?
因为我不精通C语言,所以我尝试了第二个C语言中矩阵转换的例子,简单地转换成JavaScript(下面的代码)。它冻结了浏览器 有人能帮我理解是什么导致了这个问题吗?C程序在ideone中运行良好 正如Nirk善意地指出的那样,C程序中的除法是整数而不是浮点,因此如果不使用为什么这个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;
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好得多。)