1

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

仕事はどうすればいいの?

4

4 に答える 4

3

Marshal.AllocCoTaskMemと を使用して試すことができます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);
于 2013-09-23T19:19:29.910 に答える
1
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();
}
于 2013-09-23T19:16:30.270 に答える
0

IntPtr は、プラットフォーム固有の整数を表します。サイズは、ターゲット プラットフォームのビット数に応じて 4 バイトまたは 8 バイトです。

double を整数にどのように変換しますか? データの切り捨てが予想されます。

于 2013-09-23T19:17:13.270 に答える
0

次のようなことができます。

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);
}
于 2013-09-23T19:18:34.813 に答える