有人可以这么善良并检查我的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;
}
}
答案 0 :(得分: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;
}
}
在您的情况下,n
和output
将成为Java中的一个参数
static void trans(float a, float alpha, float b, double[] output)
'n'是数组的长度,在java中为output.length
。
如果你有一个返回double的方法,它应该使用return
而不是通过参数传递(即使在C ++中)
不是分配给输出,而是将其删除并改为使用return value
。
答案 1 :(得分: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; }
这会更好。
答案 2 :(得分:0)
不,它不起作用,因为Java没有引用变量。您需要在函数末尾返回output
并更改调用代码以使用返回值。首先将方法签名更改为static double[] trans(...
。
您还应该将方法访问级别设置为public或private,具体取决于调用方法的位置。
我看到几个花括号也丢失了,所以你的缩进实际上是误导 - 修复这是一个很好的第一步;)
另请注意,output
实际上似乎是原始代码中的大小为n
的数组,而不是简单的双倍。
答案 3 :(得分: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;
}
指针参数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代码。