一个二分查找的core,求教......实在搞不定了
数据是这样的
id1 score1 id2 score2
id是升序的
传入一个值queryid,用二分查找去匹配id
代码如下
int mid = ((start + end) / 2) & 0xfffffffe;
if (pdata[mid] == queryid){
if (mid+1 < fv.m_num){
finalScore = *(pdata + mid + 1);
}
break;
}
else if (pdata[mid] < queryid){
start = mid + 2;
}
else {
end = mid - 2;
}
然后,就莫名其妙core掉了,晕死,单元测试,造各种异常值,都没办法复现
需要复现原因
求救....
[解决办法]
既然是越界 那就加些判断呗
[解决办法]
先
http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-cpp-express
右边Visual C++ 2010 Express下面的Select language...下拉选‘简体中文’,再按Install Now按钮
再参考
C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\bsearch.c
/****bsearch.c - do a binary search** Copyright (c) Microsoft Corporation. All rights reserved.**Purpose:* defines bsearch() - do a binary search an an array********************************************************************************/#include <cruntime.h>#include <stdlib.h>#include <search.h>#include <internal.h>#if defined (_M_CEE)#define __fileDECL __clrcall#else /* defined (_M_CEE) */#define __fileDECL __cdecl#endif /* defined (_M_CEE) *//****char *bsearch() - do a binary search on an array**Purpose:* Does a binary search of a sorted array for a key.**Entry:* const char *key - key to search for* const char *base - base of sorted array to search* unsigned int num - number of elements in array* unsigned int width - number of bytes per element* int (*compare)() - pointer to function that compares two array* elements, returning neg when #1 < #2, pos when #1 > #2, and* 0 when they are equal. Function is passed pointers to two* array elements.**Exit:* if key is found:* returns pointer to occurrence of key in array* if key is not found:* returns NULL**Exceptions:* Input parameters are validated. Refer to the validation section of the function.********************************************************************************/#ifdef __USE_CONTEXT#define __COMPARE(context, p1, p2) (*compare)(context, p1, p2)#else /* __USE_CONTEXT */#define __COMPARE(context, p1, p2) (*compare)(p1, p2)#endif /* __USE_CONTEXT */#if !defined (_M_CEE)_CRTIMP#endif /* !defined (_M_CEE) */SECURITYSAFECRITICAL_ATTRIBUTE#ifdef __USE_CONTEXTvoid * __fileDECL bsearch_s ( REG4 const void *key, const void *base, size_t num, size_t width, int (__fileDECL *compare)(void *, const void *, const void *), void *context )#else /* __USE_CONTEXT */void * __fileDECL bsearch ( REG4 const void *key, const void *base, size_t num, size_t width, int (__fileDECL *compare)(const void *, const void *) )#endif /* __USE_CONTEXT */{ REG1 char *lo = (char *)base; REG2 char *hi = (char *)base + (num - 1) * width; REG3 char *mid; size_t half; int result; /* validation section */ _VALIDATE_RETURN(base != NULL || num == 0, EINVAL, NULL); _VALIDATE_RETURN(width > 0, EINVAL, NULL); _VALIDATE_RETURN(compare != NULL, EINVAL, NULL); /* We allow a NULL key here because it breaks some older code and because we do not dereference this ourselves so we can't be sure that it's a problem for the comparison function */ while (lo <= hi) { if ((half = num / 2) != 0) { mid = lo + (num & 1 ? half : (half - 1)) * width; if (!(result = __COMPARE(context, key, mid))) return(mid); else if (result < 0) { hi = mid - width; num = num & 1 ? half : half-1; } else { lo = mid + width; num = half; } } else if (num) return (__COMPARE(context, key, lo) ? NULL : lo); else break; } return NULL;}#undef __fileDECL#undef __COMPARE