马歇尔双[]到IntPtr的C#?

马歇尔双[]到IntPtr的C#?,c#,arrays,marshalling,intptr,C#,Arrays,Marshalling,Intptr,我正在尝试在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); 我应该如何做这项工作

我正在尝试在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);

我应该如何做这项工作?

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

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();
}

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

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


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

您可以执行以下操作:

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);
}
for(int i=0;i<3;i++){
var a=新的IntPtr(转换为NT32(rotX[i]);
var b=新的IntPtr(转换为Int32(rotY[i]);
var c=新的IntPtr(转换为32(rotZ[i]);
设置旋转方向(a、b、c);
}

您可以执行以下操作:

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);
}
for(int i=0;i<3;i++){
var a=新的IntPtr(转换为NT32(rotX[i]);
var b=新的IntPtr(转换为Int32(rotY[i]);
var c=新的IntPtr(转换为32(rotZ[i]);
设置旋转方向(a、b、c);
}

您可以尝试使用
封送.alloctaskmem
封送.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);

您可以尝试使用
Marshal.allocTaskMem
Marshal.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);

您希望将double四舍五入为整数的方式可能重复?@rajeem_cariazo:
IntPtr
只是C中的一种类型,允许您将指针存储在整数中。是的,它也适用于64位。IntPtr将接收指向内存的指针,而不是数组值。您希望将double四舍五入为整数的方式是否可能重复?@rajeem_cariazo:
IntPtr
只是C中的一种类型,允许您将指针存储在整数中。是的,它也适用于64位。IntPtr将接收指向内存的指针,而不是数组值。op希望将指向双精度的指针转换为64位整数。这应该可以在不截断的情况下工作。op希望将指向double的指针转换为64位整数。这应该不会被截断。