2010-02-10 15 views
7

Salutations.Il est possible d'obtenir un IntPtr à partir d'un tableau int []?

En C#: Si j'ai un tableau int [] déclarée comme celui-ci

int[] array = new array[size]; 

il existe un moyen d'obtenir le IntPtr de ce tableau? Le fait est que j'utilise le framework EmguCV, et il y a un constructeur pour créer une image qui prend un IntPtr aux données de pixel, afin de construire une image à partir d'un tableau (int []). Par ailleurs, si quelqu'un pouvait me dire comment calculer la foulée, ce serait formidable.

+0

est ce C#? C++? – Pod

+0

C# .Désolé, j'ai oublié de mentionner –

Répondre

13

Vous devriez être en mesure de le faire sans danger en utilisant le code GCHandle. Voici un exemple:

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

Une façon de faire le contraire sans copier les données? – jjxtra

+0

Ceci ne copie pas les données. Il indique au GC que vous voulez un pointeur vers un objet géré et ne le déplacez pas sur moi (comme quand une collection se produit). – Bryan

+0

Je veux dire qu'il est possible de créer un tableau géré sans copier les données non gérées – jjxtra

6

Utilisez le code dangereux, comme ceci:

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

Et bien sûr, notons que intPtr ne pointe que vers le tableau * alors que le contrôle est dans le bloc fixe *. Une fois que vous avez quitté le bloc fixe, le garbage collector est libre de déplacer pArray dans la mémoire à nouveau et l'intPtr pourrait donc pointer vers des ordures. –

+0

Eh bien, bonne chose, ce 'intPtr' n'est visible qu'à l'intérieur du bloc fixe. –