2011-07-11 18 views
1

私はC++からC#にいくつかのコードを変換しようとしていますが、これらの2つの文が同等かどうかはわかりません。C++/C#配列シフトの類義語

C++(ソース):

float* df = new float[ length ] // length is a previously initialized int 
int coefIND = 0; 
do 
{ 
    float* const df2 = df + coefIND; 
    // some element reassignments such as df2[1] = x[...] * y[...]; 
    coefIND += 4; 
} 
while(coefINF < length); 
delete[] df; // this occurs much later though 

C#(翻訳?):助けを

float[] df = new float[ length ] 
int coefIND = 0; 
do 
{ 
    Array.Copy(df, 0, df, coefIND, length); 
    // some element reassignments such as df[1] = x[...] * y[...]; 
    coefIND += 4; 
} 
while(coefIND < length) 

おかげで、 グレッグ

+2

float df2 = df [coefIND]? –

+0

現在の 'index'を' df2 [1] 'の代わりに' df [index + 1] 'と書くのはどうですか? –

+0

C#コードスニペットで 'df2'を宣言していません。また、 'df2'から自分自身にコピーしているようです。また、最初の例をコピーすることはありません。これらはおそらくどのように同じである可能性がありますか? –

答えて

2

あなたはのC#の定義を示していませんdf2を使用しますが、おそらく最良の解決策は、一時的な配列にコピーするのではなく、コード本体の各インデックスにcoefINDを追加することです(後でもう一度やり直してください)。配列内の要素へのポインタを格納することはできません。

1

もしあなたがこのようにすることが必死なら、あなたはlinqを使うことができます。

df2 = df.Skip(coefIND).ToArray(); 

私はC++で使用すると、フロートのサイズは4バイト(したがって、増分4.

によってループのはるかに優れた実装がただになると仮定されていることを信じているが、

for (var coefIND=0;coefIND<df.length;coefIND++) { 
    // some element reassignments such as df[coefIND] = x[...] * y[...]; 
} 

あなたのコードは、あなたがこれを使用した方法は、あなたの配列の最後を過ぎてメモリにアクセスしていたように、[1]コメントに、配列はゼロインデックスされているDFを言及している。

+0

かなりの量の余分な配列が構築され、データがコピーされるため、これは非常に非効率的です。 –

+0

あなたは必死であればそれゆえ.... –

0

翻訳トンあなたが提供した帽子は、配列の内容を何度もコピーする必要があるため、非常に非効率的です。 C++での発現のdf[ x ]*(df + x)に相当し、あなたが取得するために、コードへの変換を適用することができます。アンロールされたループ内のすべての操作で、チャンスはあなたがいくつかを持っているということであることを

float[] df = new float[ length ] 
int coefIND = 0; 
do 
{ 
    // some element reassignments such as: 
    df[ coefIND + 1] = x[... ] * y[...]; 
    coefIND += 4; 
} 
while(coefIND < length); 

は注意余分な追加(C++コードと比較して)しかし、全体的なパフォーマンスはほぼ同じになるはずです。