问题描述
我仍然struggeling元帅从C ++到C#中的相当复杂的结构。
i'm still struggeling to marshal a quite complex struct from c++ to c#.
在C ++中结构如下:
The struct in c++ is the following:
typedef struct {
DWORD Flags;
DWORD TimeCode;
DWORD NodeMoving;
Matrix NodeRots[NUM_GYROS];
Vector Position;
DWORD ContactPoints;
float channel[NUM_CHANNELS];
} Frame;
矢量:
Vector:
typedef struct {
union {
struct {
float x, y, z;
};
float Array[3];
};
} Vector;
矩阵:
Matrix:
typedef struct {
union {
struct {
float xx, xy, xz; //This row is the right vector
float yx, yy, yz; //This row is the up vector
float zx, zy, zz; //This row is the forward vector
};
float Array[3][3]; //[row][col]
};
} Matrix;
这是我在C#中:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public unsafe struct Matrix
{
public float xx;
public float xy;
public float xz;
public float yx;
public float yy;
public float yz;
public float zx;
public float zy;
public float zz;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public unsafe struct Vector{
public float x;
public float y;
public float z;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public unsafe struct Frame{
public uint Flags;
public uint TimeCode;
public uint NodeMoving;
public fixed byte NodeRots[NUM_GYROS];
public Vector Position;
public uint ContactPoints;
public fixed float channel[CHANNEL_ARRAY_SIZE];
public unsafe float[] Channel
{
get
{
fixed (float* ptr = channel)
{
float[] array = new float[CHANNEL_ARRAY_SIZE];
Marshal.Copy((IntPtr)ptr, array, 0, CHANNEL_ARRAY_SIZE);
return array;
}
}
}
public unsafe Matrix[] nodeRots{
get{
fixed (byte* ptr = NodeRots){
IntPtr ptr2 = (IntPtr)ptr;
Matrix[] array = new Matrix[NUM_GYROS];
for (int i = 0; i < array.Length; i++)
{
array[i] = (Matrix)Marshal.PtrToStructure(ptr2, typeof(Matrix));
IntPtr oldptr = ptr2;
ptr2 = new IntPtr(oldptr.ToInt32() + Marshal.SizeOf(typeof(Matrix)));
}
return array;
}
}
}
值标志,时间码, NodeMoving,帧结构的NodeRots已经正确地传递。成员位置,ContactPoints和渠道不正确整理。我认为我必须做的定位构件的东西,但我真的不知道什么是错误完全一样。
the values Flags, TimeCode, NodeMoving, and NodeRots of the Frame struct are already passed correctly. The Members Position, ContactPoints and channel aren't marshalled correctly. I assume I have to do something with the Position Member, but I don't really know whats the mistake exactly.
推荐答案
我已经告诉过你。你不能不在字节固定
随机
I have already told you. You can't but a fixed byte
randomly.
这
public fixed byte NodeRots[NUM_GYROS];
必须
must be
public fixed Matrix NodeRots[NUM_GYROS];
那么这样的:
Then this:
Marshal.Copy((IntPtr)ptr, array, 0, CHANNEL_ARRAY_SIZE)
必须
Marshal.Copy((IntPtr)ptr, array, 0, CHANNEL_ARRAY_SIZE * sizeof(float));
那么对于 nodeRots
的getter你不吨真的需要 Marshal.PtrToStructure
,因为你的结构,可直接封。
Then for the nodeRots
getter you don't really need the Marshal.PtrToStructure
, because your struct can be marshaled directly.
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public unsafe struct Frame
{
public uint Flags;
public uint TimeCode;
public uint NodeMoving;
public fixed float nodeRots[NUM_GYROS * 9];
public Vector Position;
public uint ContactPoints;
public fixed float channel[CHANNEL_ARRAY_SIZE];
public unsafe float[] Channel
{
get
{
fixed (float* ptr = channel)
{
float[] array = new float[CHANNEL_ARRAY_SIZE];
Marshal.Copy((IntPtr)ptr, array, 0, CHANNEL_ARRAY_SIZE * sizeof(float));
return array;
}
}
}
public unsafe Matrix[] NodeRots
{
get
{
fixed (float* ptr = nodeRots)
{
Matrix[] array = new Matrix[NUM_GYROS];
for (int i = 0, y = 0; i < array.Length; i++, y += 9)
{
array[i].xx = ptr[y + 0];
array[i].xy = ptr[y + 1];
array[i].xz = ptr[y + 2];
array[i].yx = ptr[y + 3];
array[i].yy = ptr[y + 4];
array[i].yz = ptr[y + 5];
array[i].zx = ptr[y + 6];
array[i].zy = ptr[y + 7];
array[i].zz = ptr[y + 8];
}
return array;
}
}
}
}
这篇关于编组复杂的结构,以C#的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!