La partie PInkove a été prise d'une réponse SO (désolé, j'ai perdu le lien vers l'original).memcmp de PInvoke en C# ne fonctionne pas correctement pour les tableaux plus grands que 4x4
Ci-dessous le programme complet. La sortie est false
.
using System;
using System.Runtime.InteropServices;
namespace Memcpy
{
class Program
{
[DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern int memcmp(Array b1, Array b2, long count);
public static bool CompareArrays(Array b1, Array b2)
{
// Validate buffers are the same length.
// This also ensures that the count does not exceed the length of either buffer.
return b1.Length == b2.Length && memcmp(b1, b2, b1.Length) == 0;
}
static void Main(string[] args)
{
var array1 = new int[,]
{
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
};
var array2 = new int[,]
{
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
};
Console.WriteLine(CompareArrays(array1, array2));
}
}
}
Si je change la taille des tableaux à la sortie 4x4 se true
Pourquoi memcmp agir ainsi?
Qu'attendez-vous de la valeur de b1.Length? A l'intérieur – pm100
'CompareArrays' est à la fois la longueur sont égales par ailleurs, le résultat de memcmp n'est pas = 0. Il suffit de définir un point d'arrêt. ' b1.Length = '20' b2.Length = 20'' –
memcmp' prend deux pointeurs vides et une longueur en octets. Qu'est-ce qui vous fait penser que la propriété 'Length' d'un tableau est une longueur en octets? Ce n'est pas le cas, c'est le nombre d'éléments dans le tableau. Aussi, vous voulez probablement appeler 'memcmp' parce que vous croyez que c'est une fonction efficace? C'est le cas, mais le code de marshaling généré peut ne pas l'être! En fait, je pense que le code de marshalling peut être le coupable ici. –