0

この質問は、 StructureToPtrを使用したC#構造のマーシャリングからC++へのフォローアップです。私は次の構造体を持っています:

[StructLayout(LayoutKind.Explicit, Size = 120, CharSet = CharSet.Unicode)]
public unsafe struct DynamicState
{
    [FieldOffset(0)]
    public fixed double Position[3];

    [FieldOffset(24)]
    public fixed double Velocity[3];

    [FieldOffset(48)]
    public fixed double Acceleration[3];

    [FieldOffset(72)]
    public fixed double Attitude[3];

    [FieldOffset(96)]
    public fixed double AngularVelocity[3];
}

次のような配列を初期化しようとすると、次のようになります。

var dynamicState = new DynamicState();
double[] array = new double[] { 1, 2, 3 };

fixed (double* pArray = array)
{
    dynamicState.Acceleration = pArray;
}

次のエラーが発生します:The left-hand side of an assignment must be a variable, property or indexer

構造体の一部である安全でない配列を初期化する正しい方法は何ですか?

4

1 に答える 1

2

簡単なアプローチがうまくいくようです

for (int i = 0; i < 3; i++)
{
    dynamicState.AngularVelocity[i] = array[i];
}

しかし、それはあなたが探しているほど遠くないかもしれません. これはパフォーマンスが重要なコードですか?

これはより良いかもしれません:

Marshal.Copy(array, 0, new IntPtr(dynamicState.AngularVelocity), array.Length);

アンマネージ コードの経験が豊富であるとは言えませんが、少なくともこれらのオプションを検討する価値はあります...

于 2012-10-05T22:34:44.337 に答える