I would like to write an algorithm that compares one memory block with another and provides an objective value, so as to determine the quality of the match. I’ve investigated memcmp, and all it is really useful for is to determine whether two memory blocks are identical or not. I’ve written a recursive function to accomplish this, but it’s not working quite right.
DWORD CMemory::Compare( LPBYTE pDst, LPBYTE pSrc, DWORD len )
{
DWORD dwDiff;
if ( len == 0 )
{
dwDiff = 0;
}
else
{
dwDiff = (*pSrc - *pDst) * len; // * len is attempt to weight difference by MSB
dwDiff += this->Compare( pSrc + 1, pDst + 1, len - 1 );
}
return dwDiff;
}
The idea is that the more closely the two memory spaces match, the lower the return value will be. For example, let’s say there are three memory blocks containing Hello World 0 !, Hello World 1 !, and Hello World 2 !, respectively, and I would like to find out which memory block is a “best match” with candidate hello world 1 !. The idea is that I would run the Compare function three times comparing the candidate with each memory block in turn, and Compare should return the lowest value for the memory block containing Hello World 1 !. However, what it’s doing in reality, is returning the lowest value for the last memory block containing Hellow World 2 !.
Does anyone have any ideas on how I can improve this function? Thanks.
I think you need to take the absolute value of
(*pSrc - *pDst). In “Hello World 1 !”, you’re getting a 0 for the number position, while in “Hello World 2 !” you’re getting a -1, and -1 is less than 0.Also, if you use this on a long section of memory you could run into stack problems, so you might want to make it iterative.
Your algorithm won’t account for a character inserted or deleted, since it does a position by position compare. If you’re worried about that, the problem gets much harder.