2010-02-10 20 views
7

Saluti.È possibile ottenere un IntPtr da un array int []?

In C#: Se ho un array int [] dichiarato come questo

int[] array = new array[size]; 

c'è un modo per ottenere l'IntPtr da questo array?

Il fatto è che sto usando il framework EmguCV e c'è un costruttore per creare un'immagine che prende un IntPtr per i dati del pixel, al fine di costruire un'immagine da un array (int []).

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

A proposito, se qualcuno potesse dirmi come calcolare il passo, sarebbe fantastico.

+0

è questo C#? C++? – Pod

+0

C# .Sorry, ho dimenticato di menzionare –

risposta

13

Si dovrebbe essere in grado di fare questo senza codice unsafe utilizzando GCHandle. Ecco un esempio:

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

Un modo per andare viceversa senza copiare i dati? – jjxtra

+0

Questo non sta copiando i dati. Sta dicendo al GC che vuoi un puntatore a un oggetto gestito e non spostarlo su di me (come quando accade una raccolta). – Bryan

+0

Voglio dire è possibile la creazione di una matrice gestita senza copiare i dati non gestiti – jjxtra

6

Usa codice non sicuro, in questo modo:

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

E, naturalmente, notare che intPtr punta solo alla matrice * mentre il controllo è nel blocco fisso *. Una volta lasciato il blocco fisso il garbage collector è libero di muoversi intorno Parray nella memoria di nuovo e l'intPtr potrebbe quindi essere puntato spazzatura. –

+0

Beh, buona cosa che questo 'intPtr' è visibile solo all'interno del blocco fisso. –