2017-04-07 6 views
0

私が管理されていない(C++)のstruct次き:C#で固定サイズのバッファ(配列)を使用する正しい方法は何ですか?

struct parsed_data_struct 
{ 
    int some_number; 
    float some_array[4]; 
}; 

を私は値を持つ構造体の配列を埋める機能(C++のDLL)を呼び出す必要があり:

void parse_data (parsed_data_struct* parsed_data); 

私が見つけましたfixed size buffers

を使用して配列のblittable型を持つ構造体を作るための方法は、だから私の管理構造体は次のとおりです。

[StructLayout(LayoutKind.Sequential, Pack = 1)] 
public unsafe struct ParsedDataStruct 
{ 
    public int some_number; 
    public fixed float some_array[4]; 

} 

とコードを呼び出す

public void Parse(ParsedDataStruct[] parsedData) 
    { 
     unsafe 
     { 
      fixed (ParsedDataStruct* parsedDataPtr = parsedData) 
      { 
       parse_data(parsedDataPtr); 
      } 
     } 
    } 

Official documentationother resourcesはそれらで動作するように構造体アレイを固定する必要がされています。しかし、私はそれを修正することなく、この種の配列にアクセスする例をthere見た。

だから私はいくつかの質問を持っている:

  1. は右の私の例ですか?構造体の配列の修正は十分ですか?
  2. 要素にアクセスするために構造体配列を修正する必要がありますか?
+1

c#で安全でないポインタを使用する必要はありません。 ParseDataStruct [] parseDataStructを含む2番目の構造体を作成します。 [.....]定義を使用して配列をポインタとして宣言できます。 – jdweng

+0

(https://tryroslyn.azurewebsites.net/#K4OwzghgZgpgBGALgJ2AY0XAsgTwELBSzICwAUAN7lw1wAOwARgDYCWacUrAHjACZw0ACwjJOPfgSIxkAbQCMAJgAcAXQDc5AL7lyoSLEHMIYMNhwBhY6fJUytekzYdcU4nAC2+Qu4C8cPhgoCGBmRAAKVx8ZAEpNMh0yclYQRBkQCGYjEzMABWQAewBzZAgPW2paJAhEdjgANwLWASwIFPCYypo7BwdcKxzPSzh/EBgAd3MB0w74rt79aBh5hx7e9frRIcYRoYsAOi83GXU4FfXt/a5ePmO5AAZVXYByPGe5+wuHa/44cOFRAAqQQiZC5FC7LwHI7RZBXCS3WGdT5fbrnVFwQEAsEQ/zPACC73RvUSX1JtESiSAA===)[あなたは 'fixed'ずに書いてみるとどうなるか興味深い]:' FixedElementField'が表示されます代入で... – xanatos

答えて

0

私が覚えている限り、C#のような状況では安全でないポインタを使用する必要はありません。しかし、あなたのコードには問題があります。しかし、あなたのC + +コードです。 C#のあなたの構造体(それはクラスではないでしょうか?)がパックされています。あなたの構造体はC++ではありません。

#pragma pack(push, 1) 

//struct definition here 

#pragma pack(pop) 
+0

まあ、そうではありませんが、C#宣言ではパックを使用すべきではありません。実際には違いはありませんが、レイアウトはPackの値と同じです。 –

関連する問題