【问题标题】:c++ to Java translationc++ 到 Java 的翻译
【发布时间】:2011-11-01 09:18:09
【问题描述】:

谁能这么好心地检查我的 C++ 到 Java 的翻译?

这是我需要翻译的第一部分 c++ 代码(rtcmix 库的一部分http://rtcmix.org/):

static void trans(float a, float alpha, float b, int n, double *output){
       int i;
       float delta, interval = 0.0;
       delta = b - a;
       if (n <= 1) {
           *output = a;
           return;
       }
       interval = 1.0 / (n - 1.0);
       if (alpha != 0.0) {
          float denom = 1.0 / (1.0 - exp((double) alpha));
          for (i = 0; i < n; i++)
          *output++ = a + delta * (1.0 - exp((double) i * alpha * interval)) * denom;
       }
       else
       for (i = 0; i < n; i++)
           *output++ = a + delta * i * interval;
}

这是我的java翻译:

    static void trans(float a, float alpha, float b, int n, double output){
           int   i;
           float delta, interval = 0;
           delta = b - a;
           if (n <= 1) {
              output = a;
              return;
           }
           interval = (float) (1.0 / (n - 1.0));
           if (alpha != 0.0) {
              float denom = (float) (1.0 / (1.0 - Math.exp((double) alpha)));
                  else
                  for (i = 0; i < n; i++)
                  output++;
                  output= a +delta * i * interval;
               }
}

【问题讨论】:

  • 自己运行代码不是更好吗?如果你发现任何问题都想出问题?
  • 在C变体中,output是一个数组,所以*output++ = ...这个语句的意思是把数组中的当前位置赋值给表达式,然后前进到数组中的下一个位置。
  • @umesh 不,因为这只是第一部分,我停留在第二部分
  • 在java代码中返回值output参数

标签: java c++ translation


【解决方案1】:

既然你做了一个合理的尝试,我会这样写。

static void trans(double a, double alpha, double b, double[] output) {
    double delta = b - a;
    if (output.length <= 1) {
        output[0] = a;
        return;
    }
    double interval = 1.0 / (output.length - 1);
    if (alpha != 0) {
        double denom = 1 / (1 - Math.exp(alpha));
        for (int i = 0; i < output.length; i++)
            output[i] = a + (1 - Math.exp(i * alpha * interval)) * delta * denom;
    } else {
        for (int i = 0; i < output.length; i++)
            output[i] = a + i * delta * interval;
    }
}

在您的情况下,noutput 将是 Java 中的一个参数

static void trans(float a, float alpha, float b, double[] output)

'n'是数组的长度,在java中是output.length

顺便说一句:使用浮点计算只有 7 位精度并使用双精度来存储 16 位精度的值有点毫无意义。你可能会考虑反过来做。


如果你有一个返回双精度的方法,它应该使用return 而不是通过参数传递(即使在 C++ 中)

不要分配给输出,而是将其删除并改用return value

【讨论】:

  • 你的意思是代替输出++返回输出?
  • 两者都不是。您有一个使用提供的数组返回多个值的方法。
  • ok.. 现在我开始理解这种方法了。非常感谢您的修订和代码。
【解决方案2】:
                static double trans(float a, float alpha, float b, int n, double output){
       int   i;
       float delta, interval = 0;
       delta = b - a;
       if (n <= 1) {
          output = a;
          return;
       }
       interval = (float) (1.0 / (n - 1.0));
       if (alpha != 0.0) {
          float denom = (float) (1.0 / (1.0 - Math.exp((double) alpha)));
              else
              for (i = 0; i < n; i++)
              output++;
              output= a +delta * i * interval;
           } return output; }

这样会更好。

【讨论】:

    【解决方案3】:

    不,它不起作用,因为 Java 没有引用变量。您需要在函数末尾返回output,并更改调用代码以使用返回值。首先将方法签名更改为static double[] trans(...

    您还应该根据调用方法的位置将方法访问级别设置为公共或私有。

    我看到几个大括号也不见了,所以你的缩进实际上是误导 - 修复这将是一个很好的第一步;)

    还要注意output 在原始代码中实际上似乎是一个大小为n 的数组,而不是简单的双精度数。

    【讨论】:

      【解决方案4】:

      这里又是原始出处:

      static void trans(float a, float alpha, float b, int n, double *output)
      {
         int i;
         float delta, interval = 0.0;
         delta = b - a;
         if (n <= 1) {
             *output = a;
             return;
         }
         interval = 1.0 / (n - 1.0);
         if (alpha != 0.0) {
            float denom = 1.0 / (1.0 - exp((double) alpha));
            for (i = 0; i < n; i++)
            *output++ = a + delta * (1.0 - exp((double) i * alpha * interval)) * denom;
         }
         else
         for (i = 0; i < n; i++)
             *output++ = a + delta * i * interval;
      }
      

      指针参数 double *output 用于访问数组。在 Java 中,您必须将其声明为数组。

      static void trans(float a, float alpha, float b, int n, double [] output)
      {
          // Check that the array is big enough.
          // If it is too small: do nothing.
          if (output.length < n)
          {
              return;
          }
      
          int i;
          float delta, interval = 0;
          delta = b - a;
          if (n <= 1)
          {
              output[0] = a;
      
              return;
          }
      
          interval = (float) (1.0 / (n - 1.0));
          if (alpha != 0.0)
          {
              float denom = (float) (1.0 / (1.0 - Math.exp((double) alpha)));
              for (i = 0; i < n; i++)
              {
                  output[i] = a + delta * (1.0 - Math.exp((double) i * alpha * interval)) * denom;
              }
          }
          else
          {
              for (i = 0; i < n; i++)
              {
                  output[i] = a + delta * i * interval;
              }
          }
      }
      

      编辑

      我只是忽略了代码中已经使用了 exp() 函数。更正了 Java 代码。

      【讨论】:

      • 乔治奥看起来很棒。非常感谢。我想找到你的意思是 import Java Math 的函数,然后: output[i] = a + delta * (1.0 - Math.exp((double) i * alpha * interval)) * denom;
      猜你喜欢
      • 2014-01-15
      • 2013-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-20
      相关资源
      最近更新 更多