2011-11-01 73 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