C ++和C#数组和无效转换

时间:2013-11-04 12:38:49

标签: c# c++ arrays pointers

我正在将C ++代码转换为C#代码,它恰好是频域中图像的快速傅里叶变换。只是给出一些背景信息。

以下是C ++代码的链接:fft.cc

我有这个名为Step的函数,它的签名是用C ++编写的:

void step ( int n, int mj, float a[], float b[], float c[], float d[], float w[], float sgn );

并且被称为:

step ( n, mj, &x[0*2+0], &x[(n/2)*2+0], &y[0*2+0], &y[mj*2+0], w, sgn );

我想将它转换为C#,现在这个函数可以在Y或X数组上运行,具体取决于它是前向快速傅里叶变换还是后向快速傅里叶变换。 (更多背景)

我不明白的是,在C#中,做x[0*2+0]什么都不做....首先在方括号中放一个整数实际上是在该数组中的某个位置调用一个变量。

但是它在C ++中做了什么,我知道&等同于ref C#关键字,它是说从数组中得到的内容也是指向的,但我觉得在这种情况下,它不仅仅意味着它。

那么你如何在C#中调用该函数,显然这会失败:

step(n, mj, x[0 * 2 + 0], x[(n / 2) * 2 + 0], y[0 * 2 + 0], y[mj * 2 + 0], w, sgn);

3 个答案:

答案 0 :(得分:2)

在C ++中,这是将数组条目的地址传递给函数。这在C#中不起作用,因为您无法获取数组条目的地址。我建议重写声明只传递索引并分别传递数组。或者使x和y数组成为包含类的成员。

呃,或者如果你只对单个元素感兴趣,你可以改为传递元素。请记住,C ++中的float b []与float * b相同,所以如果skip只访问b [0](而不是[b + 1]),那么这可能是更简单的解决方案。)

当我们有像

这样的C ++声明时
void step (float a[]) 

相同
void step (float* a)

我们用

来称呼它
step(&x[2]);

函数步骤看到一个float数组,它从x的第二个条目开始。所以,在步骤

float f = a[0];

将引用x [2]处的元素;

当然,也可以解决a[27],但这很容易出错,因为我们不知道x的(剩余)长度。

为了帮助在这种情况下找到最佳解决方案,需要知道参数的步骤。是否可以发布阶梯函数或部分函数?

答案 1 :(得分:0)

删除地址,除非使其成为具有更改值或返回值的函数的类,否则无法更改值。而不是float a[]使用float[] a

以下是您的函数的样子,不需要标题:

public class entity
{
    public void Step(int n, int mj, float a[], float[] b, float[] c, float[] d, float[] w, float sgn)
    {
       ...
    }

    Step(0, 0, new[] { 1f, 1f }, new[] { 1f, 1f }, new[] { 1f, 1f }, new[] { 1f, 1f }, new[] { 1f, 1f }, 1f);
}

答案 2 :(得分:0)

C ++版本允许您将指针(思考引用)传递给数据中的某些元素。

对于C#版本,我建议你直接传入两个数组,然后只传入索引,所以

 void step ( int n, int mj, float a[], float b[], float c[], float d[], 
      float w[], float sgn );

变为

void Step(float[] x, float[] y, int n, int mj, int ai, int bi, int ci, int di,
     int w, float sign)
{ 
      float a = x[ai];
      float b = x[bi];
      float y = y[ci];

      // .... compute whatever


     x[ai] = a;
     x[bi] = b;
     //...
}

如果你在C ++函数中遇到像[5]这样的东西,你可以简单地使用

float aa = x[ai+5];

但当然,如果有必要,您需要考虑重新编写新值。