2013-08-05 112 views
-1

因为我不熟悉C语言,所以我尝试使用C语言中的第二个矩阵转置示例,将其转换为JavaScript(下面的代码)。它冻结了浏览器。为什么这个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); 
    } 
} 

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() 
+2

任何调试语句它愣什么时候告诉我们或值的可疑变量了? – CBIII

+0

肯定 - 它在'转置'功能期间冻结... –

+1

所以,可能不是你的问题的直接来源,但你应该阅读JS的reccomended代码风格。它最好使用分号,并打开大括号('{')inline。 –

回答

5

司浮点,没有积分,所以你需要Math.floor(next/h)

+0

例如,一些有点捣蛋的技巧也适用,例如:'((next/h)| 0)'。在负数方面存在差异,但往往会更快一些。 –

+0

@TedHopp虽然在这种情况下起作用,但这些技巧在处理((Math.pow(2,33)+1.3)| 0)=== 1' – SheetJS

+0

像魅力一样工作 –

相关问题