0

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++ で何をしているのか&、C# キーワードと同等であることはわかってrefいます。これは、ポイントされている配列からコンテンツを取得することも言っていますが、このコンテキストではそれ以上の意味があると感じています。

では、C# でその関数をどのように呼び出すのでしょうか。明らかにこれは失敗します。

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

3 に答える 3

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]);

関数 step は、x の 2 番目のエントリから始まる float の配列を認識します。だから、インサイドステップ

float f = a[0];

x[2] の要素を参照します。

もちろん、 に対処することもできますa[27]が、x の (残りの) 長さが分からないため、エラーが発生しやすくなります。

この場合に最適な解を見つけるのを助けるために、どのステップが引数を処理するかを知る必要があります。ステップ関数またはその一部を投稿することは可能でしょうか?

于 2013-11-04T12:43:36.863 に答える
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);
}
于 2013-11-04T12:48:04.393 に答える
0

C++ バージョンでは、データ内の特定の要素へのポインター (参照を考える) を渡すことができます。

C# バージョンの場合は、2 つの配列を直接渡してから、インデックスのみを渡すことをお勧めします。

 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++ 関数で a[5] のようなものに遭遇した場合は、単純に使用できます

float aa = x[ai+5];

もちろん、必要に応じて新しい値を書き戻すことを考える必要があります。

于 2013-11-04T13:09:55.630 に答える