【问题标题】:Marshall double[] to IntPtr in C#?Marshall double[] 到 C# 中的 IntPtr?
【发布时间】:2013-09-23 19:07:39
【问题描述】:

我正在尝试在 C# 中将 double[] 转换为 IntPtr。这是我要转换的数据:

double[] rotX = { 1.0, 0.0, 0.0 };
double[] rotY = { 0.0, 1.0, 0.0 };
double[] rotZ = { 0.0, 0.0, 1.0 };

这是我要在 IntPtr 中输入的函数,它是从上面的数组转换而来的:

SetRotationDirection(IntPtr rotX, IntPtr rotY, IntPtr rotZ);

我应该如何做这项工作?

【问题讨论】:

  • 您希望如何将双精度数舍入为整数?
  • @rajeem_cariazo:IntPtr 只是 C# 中的一种类型,它允许您将指针存储在整数中。而且,是的,它也适用于 64 位。 IntPtr 将接收指向内存的指针,而不是数组值。

标签: c# arrays marshalling intptr


【解决方案1】:

您可以尝试使用Marshal.AllocCoTaskMemMarshal.Copy

double[] d = new double[] {1,2,3,4,5 };
IntPtr p = Marshal.AllocCoTaskMem(sizeof(double)*d.Length);
Marshal.Copy(d, 0, p, d.Length);

【讨论】:

    【解决方案2】:
    using System.Runtime.InteropServices;
    
    /* ... */
    
    double[] rotX = { 1.0, 0.0, 0.0 };
    double[] rotY = { 0.0, 1.0, 0.0 };
    double[] rotZ = { 0.0, 0.0, 1.0 };
    
    var gchX = default(GCHandle);
    var gchY = default(GCHandle);
    var gchZ = default(GCHandle);
    
    try
    {
        gchX = GCHandle.Alloc(rotX, GCHandleType.Pinned);
        gchY = GCHandle.Alloc(rotY, GCHandleType.Pinned);
        gchZ = GCHandle.Alloc(rotZ, GCHandleType.Pinned);
    
        SetRotationDirection(
            gchX.AddrOfPinnedObject(),
            gchY.AddrOfPinnedObject(),
            gchZ.AddrOfPinnedObject());
    }
    finally
    {
        if(gchX.IsAllocated) gchX.Free();
        if(gchY.IsAllocated) gchY.Free();
        if(gchZ.IsAllocated) gchZ.Free();
    }
    

    【讨论】:

      【解决方案3】:

      IntPtr 表示平台特定的整数。它的大小是 4 或 8 字节,具体取决于目标平台位数。

      您希望如何将双精度数转换为整数?你应该期待数据截断。

      【讨论】:

      • 运算想要将 指针 转换为双精度数到 64 位整数。这应该可以在没有截断的情况下工作。
      【解决方案4】:

      你可以这样做:

      for(int i = 0; i < 3; i++) {
        var a = new IntPtr(Convert.ToInt32(rotX[i]));
        var b = new IntPtr(Convert.ToInt32(rotY[i]));
        var c = new IntPtr(Convert.ToInt32(rotZ[i]));
        SetRotationDirection(a, b, c);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-01
        • 2010-12-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多