2010-12-29 19 views
1

私はCコードの再帰関数に固執しています(私はCコードを書きませんでした)。ここに私が変換しているスニペットがあります:CからC#へのコード変換 - パラメータとしての配列

int makeroad(float x1, float y1, float x2, float y2, float var, float X[], float Y[], float prec) 
{ 
//stuff 
k+=makeroad(x,y,x2,y2,var,X+k,Y+k,prec); 
} 

私はこれが何をしているのかよく分かりません。これは、その名前を持つCコード内の唯一の関数なので、オーバーロードの問題ではありません。再帰的に自分自身を呼び出すときは、XとY配列にkを追加します。 C#でそれを置くと、次のようになります

int makeroad (float x1, float y1, float x2, float y2, float var, float[] X, float[] Y, float prec) 
    { 
     //stuff 
     k += makeroad(x, y, x2, y2, var, X + k, Y + k, prec); 
    } 

およびVisual Studioは、X + KとY + kが無効であることを私に語っています。元のCコードは、Visual C++ Express 2010でコンパイルされて正常に動作します。大文字と小文字のxとy変数が混同しているとは思われません。それがあった場合、コードは幸運で働いています。

アイデア?

+0

ここで、kは何ですか?またはxまたはy ... –

答えて

0

Cでは、Cの配列は、その配列の位置を渡すことによって渡されるので、k番目の項目(つまりarray+k)にポインタを渡すだけで、既存のものから最初のk要素を除いて配列を "作る"ことができます。最初の要素(このような「新しい」配列は、「元の」配列の同じ要素を参照するため、まったく新しいものではありません)。

C#では、配列が連続したメモリへのポインタとして扱われないため、これは機能しません。素早い修正が必要な場合は、新しい配列を作成し、Array.Copyでk番目から最後まで要素をコピーしてから、この新しい配列を再帰関数に渡すことができますが、これは遅く、アルゴリズム配列の要素を変更します(変更は他の配列には反映されません。これはコピーされているためです)。

より良い解決策は、そのまま配列を渡し、パラメータとしてkを渡し、その位置から配列を使用してルーチンを開始させることです。あなたは実質的なスピード違反なしで同じ行動を達成すべきです。

0

実際に渡されたものが配列の先頭へのポインタであるように、配列はC言語での参照によって渡されます。たとえばパスしたとき"X + k"は、kから始まるサブ配列へのポインタを渡しています。

C#が配列パラメータで何をしているのかわかりません。

0

X + k、Y + kは配列へのポインタです。呼び出された関数の配列の先頭部分を「スキップする」ことができます。

他のCLRコードとCコードを混在させることができますので、実際に変換する必要はありません。

あなたが本当に必要と思うのであれば、X、Y、およびkを単に渡し、kをXとYの開始オフセットとして使用するように書き換えることを検討するかもしれません。別の言語に移植することが困難になります。