2016-04-01 11 views
3

私はC#プロジェクトで再利用しようとしているC++コードを持っています。 ここm_Bufferがフロートの配列である被写体C++からC#への配列操作の書き換え

for (int i = 0; i < numOfSamples; i++) 
{ 
     *(((double*)m_Buffer) + i) 
      = max(*(((double*)m_Buffer) + i*4), *(((double*)m_Buffer) + i*4 + 1)); 
} 

あります。コードのこの部分は、配列の各2つの "浮動小数点"を1つの "double"として読み込み、次にいくつかの操作を行います(シフトする、最大を選択するなど)。 質問は - どのようにC#で同じ操作を行うことができますか?

たとえば、私は配列[12,45,26,32,07,89,14,11]を持っています。位置0と1(12と45)のアイテムを変換して、新しい番号(ダブルタイプ)(私はよく分からない - 多分最低)最高の場所のビットの一部は12と低いものから形成されることになる - 45

+0

私の理解では、ビットシフトは関与していません。 'numOfSamples'とは何ですか?どうやら、 'm_buffer'は少なくとも' numOfSamples * 4 + 1'要素の 'double'型(' double'が4バイトを使うならば)を含んでいなければなりません。 – Codor

+0

numOfSamples - 境界のこの操作を保持するのに十分な大きさの配列の長さ –

+2

( '*(pointer + index)'は 'pointer [index]'の代わりに反発するコードです。 – greybeard

答えて

0

私は解決策を得ました。キーポイントは、ここで私は、単純に新しい配列を作成し、[2 * i]にするfloat2にFLOAT1及び配列[2 * I + 1]に配列を入れた構造

[StructLayout(LayoutKind.Explicit)] 
struct MyStruct 
{ 
    [FieldOffset(0)] 
    public double Double; 

    [FieldOffset(0)] 
    public float Float1; 

    [FieldOffset(4)] 
    public float Float2; 
} 

です。次に、それぞれのnew_array [i]にMath.Maxを適用してください。

1

からそれはのようなものでなければなりません:

for (int i = 0; i < numOfSamples; i++) 
{ 
    m_Buffer[i] = Math.Max(m_Buffer[i * 4], m_Buffer[i * 4 + 1]); 
} 

m_Bufferは少なくともnumOfSamples * 4 + 1要素の配列でなければなりません。

+0

これは私が考えていたものですが、なぜ疑問に思われるのでしょうか? '((double *)m_Buffer)+ i)'( '(double *)m_buffer – Codor

+2

@Codor C/C++では、 'ptr [x]'表記と '*(ptr + x)'表記の間には等価性があります。それを書いたプログラマはおそらくORがポインタ記法を好んでいないことを知っていたでしょう – xanatos

+1

そして 'm_Buffer'が' char * 'なので多分 '(double *)'はおそらくあります – xanatos

関連する問題