首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-09-05 
一个二分查找的core,求教......实在搞不定了数据是这样的id1 score1 id2 score2id是升序的传入一个值query

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

热点排行