C# 当ushort*和byte*正常时,int*指针不编译
对于一些非托管代码,我在C#包装器中有如下结构。我尝试使用指针来传递一些数据,这对于ushort*和byte*部分很好,但对于固定int不起作用C# 当ushort*和byte*正常时,int*指针不编译,c#,pointers,unmanaged,managed,C#,Pointers,Unmanaged,Managed,对于一些非托管代码,我在C#包装器中有如下结构。我尝试使用指针来传递一些数据,这对于ushort*和byte*部分很好,但对于固定int不起作用 [StructLayout(LayoutKind.Sequential)] unsafe public struct IMAGE { public fixed int nSize[2]; public ushort* pDepthIm; public byte* pColorIm; } 要用一些信息填充此结构,我使用: uns
[StructLayout(LayoutKind.Sequential)]
unsafe public struct IMAGE
{
public fixed int nSize[2];
public ushort* pDepthIm;
public byte* pColorIm;
}
要用一些信息填充此结构,我使用:
unsafe public void LoadImage(ushort[] depthImage, byte[] rgbImage, int[] size)
{
unsafe
{
fixed (int* pSize = size)
fixed (ushort* pDepth = depthImage)
fixed (byte* pRGB = rgbImage)
{
_im.nSize = pSize;
_im.pColorIm = pRGB;
_im.pDepthIm = pDepth;
...
}
}
}
At\u im.nSize=pSize代码>编译器显示错误,说明:
不能使用非固定表达式中包含的固定大小缓冲区。
尝试使用fixed语句
我已经注意到,int
是以不同的方式初始化的(不是使用指针-*
,而是作为固定int
),但我不知道如何传递值。将鼠标悬停在变量上时,它显示为int*
更新:我遇到了关于上述消息的问题。我现在确定它与IMAGE
结构中的fixed
语句有关,但我仍然不知道如何修复它。您不能将指针分配给数组。您必须使用memcpy
memcpy(_im.nSize, size, sizeof(_im.nSize));
事实上,您不能为数组分配任何内容。您可以修改数组的值,但不能重新分配它
如果语言允许,我还会检查数组长度,将其作为参数传递,或者检查它的.length
。如果找到访问固定int[2]
的方法,如下所示:
public unsafe void LoadImage(ushort[] depthImage, byte[] rgbImage, int[] size)
{
unsafe
{
fixed (int* pSize = _im.nSize)
fixed (ushort* pDepth = depthImage)
fixed (byte* pRGB = rgbImage)
fixed (S_IMAGE* pim = &_im)
{
pSize[0] = size[0];
pSize[1] = size[1];
_im.pColorIm = pRGB;
_im.pDepthIm = pDepth;
}
}
}
我不确定这是否是一个好方法,或者这是否是它的本意,但至少它按预期工作…您甚至不需要修改大小。只要用两个赋值复制这两个元素,或者复制一个微小的for循环即可。@usr如果大小错误,则是业务逻辑错误。在使用输入进行操作之前,检查输入是否完全符合我们的预期是一种很好的做法,有时可以节省大量时间。感谢您的建议。它看起来像 MycPy是一个C++函数。我用的是C#(如果我的问题不清楚的话,很抱歉)。我不清楚我的意思。我同意验证,但我认为没有必要使用memcpy+1@usrmemcpy做的事情与您想做的完全相同,并且以清晰易懂的方式完成。它的性能可能比双重赋值更差,但只是稍微差一点。除非这是应用程序功能的90%,否则它的运行速度也一样快。而且是可移植的,如果nSize
更改为int[4]
它仍然可以正常工作,而2个作业则不行。我不明白你为什么认为这是一个错误的解决方案。显示的代码是C。我添加了C++标签,因为我正在访问一个非托管C++库。