私が管理されていない(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 documentationとother resourcesはそれらで動作するように構造体アレイを固定する必要がされています。しかし、私はそれを修正することなく、この種の配列にアクセスする例をthere見た。
だから私はいくつかの質問を持っている:
- は右の私の例ですか?構造体の配列の修正は十分ですか?
- 要素にアクセスするために構造体配列を修正する必要がありますか?
c#で安全でないポインタを使用する必要はありません。 ParseDataStruct [] parseDataStructを含む2番目の構造体を作成します。 [.....]定義を使用して配列をポインタとして宣言できます。 – jdweng
(https://tryroslyn.azurewebsites.net/#K4OwzghgZgpgBGALgJ2AY0XAsgTwELBSzICwAUAN7lw1wAOwARgDYCWacUrAHjACZw0ACwjJOPfgSIxkAbQCMAJgAcAXQDc5AL7lyoSLEHMIYMNhwBhY6fJUytekzYdcU4nAC2+Qu4C8cPhgoCGBmRAAKVx8ZAEpNMh0yclYQRBkQCGYjEzMABWQAewBzZAgPW2paJAhEdjgANwLWASwIFPCYypo7BwdcKxzPSzh/EBgAd3MB0w74rt79aBh5hx7e9frRIcYRoYsAOi83GXU4FfXt/a5ePmO5AAZVXYByPGe5+wuHa/44cOFRAAqQQiZC5FC7LwHI7RZBXCS3WGdT5fbrnVFwQEAsEQ/zPACC73RvUSX1JtESiSAA===)[あなたは 'fixed'ずに書いてみるとどうなるか興味深い]:' FixedElementField'が表示されます代入で... – xanatos