C++/C#浮动问题 我在C++中尝试从C++中读取一个结构时遇到了问题。 我这样做了很多次,而且一直有效,但我从来没有使用过浮点数
以下是我在C端使用的结构:C++/C#浮动问题 我在C++中尝试从C++中读取一个结构时遇到了问题。 我这样做了很多次,而且一直有效,但我从来没有使用过浮点数,c#,c++,interop,C#,C++,Interop,以下是我在C端使用的结构: 这是我在C++方面使用的结构: typedef struct XnVector3D { XnFloat X; XnFloat Y; XnFloat Z; } XnVector3D; class VirtualPosition { public: XnVector3D RealPosition; XnVector3D ProjectedPosition;
这是我在C++方面使用的结构:
typedef struct XnVector3D
{
XnFloat X;
XnFloat Y;
XnFloat Z;
} XnVector3D;
class VirtualPosition {
public:
XnVector3D RealPosition;
XnVector3D ProjectedPosition;
VirtualPosition(void) { }
VirtualPosition(XnVector3D real, XnVector3D projected) {
RealPosition = real;
ProjectedPosition = projected;
}
};
class UserData
{
public:
int misc; // Misc number to check if i have the correct pointer ( debug only )
bool Valid;
VirtualPosition RightHand;
VirtualPosition LeftHand;
VirtualPosition Head;
};
现在,用于获取数据的C#part:
public unsafe UserData GetUserData(UInt32 user)
{
IntPtr pos = GetData(_Index, user);
UserData* ptr = ((UserData*)pos.ToPointer());
UserData result = *ptr;
return result;
}
[DllImport("KinectNative.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr GetData(Int32 index, UInt32 user);
最后是用于检索数据的部分(C++):
EXPORT-UserData*GetData(int-index,XnUserID-user)
{
如果(_LastData!=NULL)_LastData->~UserData();
系统(“cls”);
_LastData=newuserdata(_Context->GetDevice(index)->GetData(user));
STD::CUT> P>这可能是因为.NET代码>布尔< /COD>与您的C++实现大小不一样吗?代码> Boo.<代码>?我认为VC++使用1字节来编写代码> BoOL < /C> > .NET使用2或4字节来编写<代码>系统。
尝试将IsValid定义为Byte
而不是Boolean
,看看它是否有效
我认为您还可以在Boolean
之前添加marshallas属性,强制将其封送为1字节:
[StructLayout(LayoutKind.Sequential)]
public struct UserData
{
public UInt32 misc;
[MarshalAs(UnmanagedType.U1)]
public Boolean IsValid;
public VirtualPosition RightHand;
public VirtualPosition LeftHand;
public VirtualPosition Head;
}
<>但是我不确定它对你的情况会起作用,因为C++直接使用指针,而不是封送处理。 在CLI中,布尔被定义为4字节,然而sieOf将报告为1字节。所有0表示错误,其他任何东西都是真的。< /p>如何定义C++中的xnFrand?它定义为浮点/**浮点(32位)。*/typedef float XnFloat;
EXPORT UserData* GetData(int index, XnUserID user)
{
if (_LastData != NULL) _LastData->~UserData();
system("cls");
_LastData = new UserData(_Context->GetDevice(index)->GetData(user));
std::cout << "X: " << (int)_LastData->Head.ProjectedPosition.X << " Y:" << (int)_LastData->Head.ProjectedPosition.Y << std::endl;
return _LastData;
}
[StructLayout(LayoutKind.Sequential)]
public struct UserData
{
public UInt32 misc;
[MarshalAs(UnmanagedType.U1)]
public Boolean IsValid;
public VirtualPosition RightHand;
public VirtualPosition LeftHand;
public VirtualPosition Head;
}