2010-02-10 6 views
7

Grüße.Es ist möglich, ein intPtr von einem int [] Array zu bekommen?

In C#: Wenn ich habe erklärt, ein int [] array wie diese

int[] array = new array[size]; 

es ein Weg ist, die IntPtr aus dieser Reihe zu bekommen?

Die Sache ist, dass ich das EmguCV-Framework verwende, und es gibt einen Konstruktor, um ein Bild zu erstellen, das ein IntPtr zu den Pixeldaten nimmt, um ein Bild aus einem Array (int []) zu erstellen.

Übrigens, wenn mir jemand sagen könnte, wie man den Schritt berechnet, wäre das großartig.

+0

ist das C#? C++? – Pod

+0

C# .Leider habe ich vergessen zu erwähnen –

Antwort

13

sollten Sie in der Lage sein, dies mit GCHandle ohne unsicheren Code zu tun. Hier ist ein Beispiel:

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

Gibt es eine Möglichkeit, den umgekehrten Weg zu gehen, ohne Daten zu kopieren? – jjxtra

+0

Dies kopiert nicht die Daten. Es teilt dem GC mit, dass Sie einen Zeiger auf ein verwaltetes Objekt wünschen und es nicht auf mir verschieben (wie wenn eine Sammlung passiert). – Bryan

+0

Ich meine, ist es möglich, ein verwaltetes Array zu erstellen, ohne die nicht verwalteten Daten zu kopieren – jjxtra

6

Verwenden unsicheren Code, wie folgt aus:

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

Und natürlich beachten Sie, dass intPtr nur auf das Array * zeigt, während die Kontrolle im festen Block * ist. Sobald Sie den fixierten Block verlassen, kann der Garbage Collector pArray wieder im Speicher bewegen und der intPtr könnte daher auf den Müll zeigen. –

+0

Nun gut, dieses 'intPtr' ist nur innerhalb des festen Blocks sichtbar. –

Verwandte Themen