user-0 提问: 二分法的一些问题

回复:
user: user-1
content: 建议楼主重新贴下代码和说明下问题。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-2
content: 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_CONTEXT void * __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

user: user-3
content: 引用 3 楼 qq_36151474 的回复:[quote=引用 1 楼 user-3 的回复:] 将数组大小通过参数传到paixu函数中  数组元素个数作为参数时已经退化为指针了，所以你在paixu中的 l 是不能得到数元素个数的 引用 1 楼 user-3 的回复:将数组大小通过参数传到paixu函数中  数组元素个数作为参数时已经退化为指针了，所以你在paixu中的 l 是不能得到数元素个数的  确实用参数传进去就好啦 还有一个小问题 为什么这样找不到2000 能找到0  2000也是在里面的啊[/quote]  不懂，必要时单步调试代码分析原因，没法帮你调试

user: user-0
content: 引用 1 楼 user-3 的回复:将数组大小通过参数传到paixu函数中  数组元素个数作为参数时已经退化为指针了，所以你在paixu中的 l 是不能得到数元素个数的 引用 1 楼 user-3 的回复:将数组大小通过参数传到paixu函数中  数组元素个数作为参数时已经退化为指针了，所以你在paixu中的 l 是不能得到数元素个数的  确实用参数传进去就好啦 还有一个小问题 为什么这样找不到2000 能找到0  2000也是在里面的啊

user: user-3
content: paixu函数中sizeof(a)得到的只是指针的大小（32位程序为4）

user: user-3
content: 将数组大小通过参数传到paixu函数中  数组元素个数作为参数时已经退化为指针了，所以你在paixu中的 l 是不能得到数元素个数的