Marshall double[] to IntPtr в С#?

Я пытаюсь преобразовать 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);

Как я должен выполнять работу?


person Nick X Tsui    schedule 23.09.2013    source источник
comment
возможный дубликат Можно получить IntPtr из массива int[]?   -  person Tim S.    schedule 23.09.2013
comment
как вам нравится округление вашего двойника до целого числа?   -  person rajeemcariazo    schedule 23.09.2013
comment
@rajeem_cariazo: IntPtr — это просто тип в C#, который позволяет хранить указатель в целом числе. И да, он также работает на 64-битной версии. IntPtr получит указатель на память, а не на значения массива.   -  person    schedule 23.09.2013


Ответы (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);
person King King    schedule 23.09.2013

IntPtr представляет целое число, зависящее от платформы. Его размер составляет 4 или 8 байт в зависимости от разрядности целевой платформы.

Как бы вы хотели преобразовать двойное число в целое число? вы должны ожидать усечения данных.

person SecureTeam Software    schedule 23.09.2013
comment
Оператор хочет преобразовать указатель в двойное число в 64-битное целое число. Это должно работать без усечения. - person Giacomo d'Antonio; 05.01.2021

Вы можете сделать что-то вроде этого:

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);
}
person rajeemcariazo    schedule 23.09.2013