2011-11-01 113 views
2

有人可以这么好看,并检查我的C++到Java翻译?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; 
       } 
} 
+2

对自己运行你的代码不是很好吗?比如果你发现任何问题出现问题? –

+1

在C变体中,'output'是一个数组,因此语句'* output ++ = ...'意味着数组中的当前位置被分配了表达式,然后前进到数组中的下一个位置。 –

+0

@umesh没有,因为这只是第一部分和Im卡在第二个 – menemenemu

回答

0

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

您还应该将方法访问级别设置为public或private,具体取决于调用方法的位置。

我看到几个大括号也不见了,因此你的缩进实际上是误导 - 固定,这将是一个良好的开端;)

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

2

既然你已经做出了合理的尝试,下面是我将如何写它。

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代替。

+0

你的意思,而不是输出+ +返回输出? – menemenemu

+0

都没有。你有一个使用提供的数组返回多个值的方法。 –

+0

好的..现在我开始明白这个方法了。非常感谢修订和代码。 – menemenemu

1
   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; } 

这样会更好。

0

下面是再次原始源:

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) 
{ 
    // 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代码。

+0

看起来令人惊叹的乔治。非常感谢。我想用找到你的意思是导入Java Math的函数,然后:output [i] = a + delta *(1.0 - Math.exp((double)i * alpha * interval))* denom; – menemenemu