2010-02-10 19 views
7

Saludos.¿Es posible obtener un IntPtr desde una matriz int []?

En C#: Si tengo una [] int matriz declarada como esto

int[] array = new array[size]; 

hay una manera de conseguir la IntPtr de esta serie?

Lo que pasa es que estoy usando el framework EmguCV, y hay un constructor para crear una imagen que toma un IntPtr a los datos de píxeles, para construir una imagen desde una matriz (int []).

Image<Gray,Int32> result = new Image<Gray,int>(bitmap.Width,bitmap.Height,stride,"**array.toPointer??**"); 

Por cierto, si alguien pudiera decirme cómo calcular el paso, sería genial.

+0

¿este es C#? C++? – Pod

+0

C# .Lo siento, me olvidé de mencionar –

Respuesta

13

Usted debe ser capaz de hacer esto sin código no seguro utilizando GCHandle. Aquí hay un ejemplo:

GCHandle handle = GCHandle.Alloc(array, GCHandleType.Pinned); 
try 
{ 
    IntPtr pointer = handle.AddrOfPinnedObject(); 
} 
finally 
{ 
    if (handle.IsAllocated) 
    { 
     handle.Free(); 
    } 
} 
+0

¿Hay alguna forma de ir al revés sin copiar datos? – jjxtra

+0

Esto no está copiando los datos. Le está diciendo al GC que desea un puntero a un objeto administrado y no lo mueva sobre mí (como cuando ocurre una recopilación). – Bryan

+0

Quiero decir que es posible crear una matriz administrada sin copiar los datos no administrados – jjxtra

6

Uso de código no seguro, como este:

unsafe 
{ 
    fixed (int* pArray = array) 
    { 
    IntPtr intPtr = new IntPtr((void *) pArray); 
    } 
} 
+9

Y, por supuesto, tenga en cuenta que intPtr solo apunta a la matriz *, mientras que el control está en el bloque fijo *. Una vez que abandona el bloque fijo, el recolector de basura puede mover el array de nuevo en la memoria y, por lo tanto, intPtr podría estar apuntando a la basura. –

+0

Bueno, es bueno que este 'intPtr' solo sea visible dentro del bloque fijo. –

Cuestiones relacionadas