juin
2007
En C, on manipule beaucoup de tableaux. Comment intéropérer des tableaux entre une bibliothèque C et un programme C#.
Imaginons que j’ai une dll C qui ait des méthodes de tri de tableaux, et particulièrement une méthode qui me trie un tableau d’entier.
J’ai un programme C# qui (ô hasard) utilise un tableau d’entier et (comble de malchance) je ne connais pas la méthode Sort de la classe Array du framework Dotnet.
Je vais donc utiliser ma bibliothèque C pour trier mon tableau d’entier C#. Considérons cette fonction de ma bibliothèque C :
{
int i, inversion;
do
{
inversion = 0;
for(i=0; i < longueur - 1 ; i++)
{
if (t[i]>t[i+1])
{
int temp;
temp = t[i];
t[i] = t[i+1];
t[i+1] = temp;
inversion = 1;
}
}
longueur--;
}
while (inversion);
}
Cette fonction prend un pointeur sur un tableau d’entier en paramètre, ainsi que la longueur du tableau (nombre d’éléments). Il s’agit d’un tri classique par ordre croissant.
En C#, je déclare la fonction :
public static extern void triCpp(IntPtr t, int longueur);
Je passe donc un pointeur (IntPtr) et un entier.
Ensuite, je crée un tableau d’entier non trié, que j’affiche sur la console :
Console.WriteLine("-------------");
int size = tableau.Length;
for (int i = 0; i < size; i++)
Console.WriteLine(tableau[i]);
J’alloue ensuite un espace mémoire correspondant à la taille d’un élément du tableau multiplié par le nombre d’éléments du tableau :
IntPtr tabUnmanaged = Marshal.AllocHGlobal(Marshal.SizeOf(tableau[0]) * size);
J’utilise la fonction Marshal.Copy pour remplir cet espace mémoire avec les données de mon tableau managé :
Marshal.Copy(tableau, 0, tabUnmanaged, size);
Puis j’appelle ma fonction de tri qui met à jour le tableau natif :
triCpp(tabUnmanaged, size);
Il ne me reste plus qu’à faire l’opération inverse, c’est à dire copier le tableau natif dans mon tableau C# pour effectuer la mise à jour :
Console.WriteLine("-------------");
for (int i = 0; i < size; i++)
Console.WriteLine(tableau[i]);
Sur la console s’affiche désormais mon tableau trié.
Voilà pour la copie de tableau.
Commentaires récents
- [Tests] Arrange Act Assert, une traduction ? dans
- [UnitTest][C#] Tester une méthode privée dans
- Récupérer une valeur d’un contrôle depuis une autre Form / inclusions croisées et déclaration anticipée dans
- Tutoriel : Utiliser la ListBox et l’Isolated Storage dans vos applications Windows Phone 7 avec Silverlight dans
- Tutoriel : Utiliser la ListBox et l’Isolated Storage dans vos applications Windows Phone 7 avec Silverlight dans
Archives
- janvier 2013
- avril 2012
- janvier 2012
- juin 2011
- janvier 2011
- décembre 2010
- novembre 2010
- septembre 2010
- juin 2010
- mars 2010
- février 2010
- janvier 2010
- décembre 2009
- novembre 2009
- octobre 2009
- septembre 2009
- août 2009
- juillet 2009
- mai 2009
- avril 2009
- mars 2009
- janvier 2009
- décembre 2008
- novembre 2008
- octobre 2008
- septembre 2008
- août 2008
- juillet 2008
- juin 2008
- mai 2008
- avril 2008
- mars 2008
- février 2008
- janvier 2008
- décembre 2007
- novembre 2007
- octobre 2007
- septembre 2007
- août 2007
- juillet 2007
- juin 2007
- mai 2007