读书人

一个2分查找的core求教.实在搞不定了

发布时间: 2012-09-05 15:19:34 作者: rapoo

一个二分查找的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

C/C++ code
/****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 

读书人网 >C++

热点推荐