Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++/C#浮动问题 我在C++中尝试从C++中读取一个结构时遇到了问题。 我这样做了很多次,而且一直有效,但我从来没有使用过浮点数_C#_C++_Interop - Fatal编程技术网

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端使用的结构:

这是我在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;
}