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

对于一些非托管代码,我在C#包装器中有如下结构。我尝试使用指针来传递一些数据,这对于ushort*和byte*部分很好,但对于固定int不起作用

[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++库。