-2

私は C に精通していないので、この2 番目の行列転置の例を 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()
4

1 に答える 1

5

除算は整数ではなく浮動小数点であるため、必要ですMath.floor(next / h)

于 2013-08-05T01:57:23.147 に答える