【问题标题】:int* pointer not compiling while ushort* and byte* are fineint* 指针未编译,而 ushort* 和 byte* 很好
【发布时间】:2014-04-10 12:45:15
【问题描述】:

对于一些非托管代码,我确实在 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;

            ...
        }
     }
 }

_im.nSize = pSize;,编译器显示错误,声明:

您不能使用包含在不固定表达式中的固定大小的缓冲区。 尝试使用固定语句。

我已经注意到int 以不同的方式初始化(​​不是使用指针-*,而是使用fixed int),但我不知道如何传递值。将鼠标悬停在变量上时,显示为int*...

更新:我遇到了MSDN error reference 来获取上述消息。我现在确定它与 IMAGE 结构中的 fixed 语句有关,但我仍然不知道如何修复它。

【问题讨论】:

  • 所有显示的代码都是 C#。我添加了 C++ 标记,因为我正在访问非托管 C++ 库。

标签: c# pointers unmanaged managed


【解决方案1】:

您不能将指针分配给数组。你必须使用memcpy

memcpy(_im.nSize, size, sizeof(_im.nSize));

事实上,您不能将任何内容分配给数组。您可以修改数组的值,但不能重新分配它。

如果语言允许,我还会检查数组长度,将其作为参数传递或检查它的 .length

【讨论】:

  • 你甚至不需要修复size。只需使用两个赋值或一个微小的 for 循环复制两个元素。
  • @usr 如果大小不对,就是业务逻辑错误。在使用它之前检查输入是否完全符合我们的预期是一种很好的做法,它有时可以节省大量时间。
  • 感谢您的建议。看起来memcpy 是一个 C++ 函数。我正在使用 C#(对不起,如果我的问题不清楚)。
  • 我不清楚我的意思。我同意验证,但我认为不需要 memcpy。 +1
  • @usr memcpy 做的事情与您想做的事情完全相同,并且以清晰易懂的方式完成。它的性能可能比双重分配更差,但只是轻微的。除非这是应用程序的 90%,否则它会以同样快的速度运行。并且是可移植的,如果 nSize 更改为 int[4] 它仍然可以正常工作,而 2 个作业则不会。我不明白你为什么认为这是一个错误的解决方案
【解决方案2】:

如果找到像这样访问fixed 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;
        }
    }
}

我不确定这是否是一个好方法,或者这是否是它的本意,但至少它按预期工作......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 2013-07-11
    • 2011-06-25
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多