Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C b搜索()不';我找不到我的东西_C_Unix_Crt_Bsearch - Fatal编程技术网

C b搜索()不';我找不到我的东西

C b搜索()不';我找不到我的东西,c,unix,crt,bsearch,C,Unix,Crt,Bsearch,有人能告诉我为什么下面代码中的bsearch()在列表中找不到“getwidth”项吗?我试过几个编译器,但都不能用,所以这一定是我代码中的一个bug。然而,我真的不知道那里出了什么问题。传递给bsearch()的回调始终返回以下内容!=0但仍然只调用了5次,然后bsearch()返回NULL,尽管它没有迭代所有项。为什么呢 代码如下: #include <stdio.h> #include <stdlib.h> #include <ctype.h> typ

有人能告诉我为什么下面代码中的bsearch()在列表中找不到“getwidth”项吗?我试过几个编译器,但都不能用,所以这一定是我代码中的一个bug。然而,我真的不知道那里出了什么问题。传递给bsearch()的回调始终返回以下内容!=0但仍然只调用了5次,然后bsearch()返回NULL,尽管它没有迭代所有项。为什么呢

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

typedef struct wxLuaBindMethod
{
    const char *name;
    int method_type;
    void *wxluacfuncs;
    int wxluacfuncs_n;
    void *basemethod;
} wxLuaBindMethod;

#define WXLUAMETHOD_CONSTRUCTOR 0x0001
#define WXLUAMETHOD_METHOD 0x0002
#define WXLUAMETHOD_DELETE 0x2000

wxLuaBindMethod wxSize_methods[] = {
    { "DecBy", WXLUAMETHOD_METHOD, NULL, 1, NULL},
    { "DecTo", WXLUAMETHOD_METHOD, NULL, 1, NULL},
    { "GetHeight", WXLUAMETHOD_METHOD, NULL, 1, NULL},
    { "GetWidth", WXLUAMETHOD_METHOD, NULL, 1, NULL},
    { "IncBy", WXLUAMETHOD_METHOD, NULL, 1, NULL},
    { "IncTo", WXLUAMETHOD_METHOD, NULL, 1, NULL},
    { "IsFullySpecified", WXLUAMETHOD_METHOD, NULL, 1, NULL},
    { "Scale", WXLUAMETHOD_METHOD, NULL, 1, NULL},
    { "Set", WXLUAMETHOD_METHOD, NULL, 1, NULL},
    { "SetDefaults", WXLUAMETHOD_METHOD, NULL, 1, NULL},
    { "SetHeight", WXLUAMETHOD_METHOD, NULL, 1, NULL},
    { "SetWidth", WXLUAMETHOD_METHOD, NULL, 1, NULL},
    { "delete", WXLUAMETHOD_METHOD|WXLUAMETHOD_DELETE, NULL, 1, NULL},
    { "op_add", WXLUAMETHOD_METHOD, NULL, 1, NULL},
    { "op_div", WXLUAMETHOD_METHOD, NULL, 1, NULL},
    { "op_eq", WXLUAMETHOD_METHOD, NULL, 1, NULL},
    { "op_iadd", WXLUAMETHOD_METHOD, NULL, 1, NULL},
    { "op_idiv", WXLUAMETHOD_METHOD, NULL, 1, NULL},
    { "op_imul", WXLUAMETHOD_METHOD, NULL, 1, NULL},
    { "op_isub", WXLUAMETHOD_METHOD, NULL, 1, NULL},
    { "op_mul", WXLUAMETHOD_METHOD, NULL, 1, NULL},
    { "op_ne", WXLUAMETHOD_METHOD, NULL, 1, NULL},
    { "op_set", WXLUAMETHOD_METHOD, NULL, 1, NULL},
    { "op_sub", WXLUAMETHOD_METHOD, NULL, 1, NULL},
    { "wxSize", WXLUAMETHOD_CONSTRUCTOR, NULL, 1, NULL},
    { 0, 0, 0, 0 },
}; 

int wxLuaBindMethod_CompareByNameFnGet(const void *p1, const void *p2)
{
    int v = strcasecmp(((const wxLuaBindMethod*)p1)->name, ((const wxLuaBindMethod*)p2)->name);

    printf("CMP: %s = %s? --> %d\n", ((const wxLuaBindMethod*)p1)->name, ((const wxLuaBindMethod*)p2)->name, v);

    return v;
}

int main(int argc, char *argv[])
{
    wxLuaBindMethod methodItem = { "getwidth", 10, 0, 0, 0 };
    wxLuaBindMethod *wxlMethod;

    wxlMethod = (wxLuaBindMethod *)bsearch(&methodItem, wxSize_methods, 25, sizeof(wxLuaBindMethod), wxLuaBindMethod_CompareByNameFnGet);

    printf("RESULT: %p\n", wxlMethod);

    return 0;                                                       
} 

我真的不明白为什么它不起作用,虽然它实际上只有几行。有人能解释一下这种奇怪的行为吗?谢谢

您可以使用
strcasecmp()
比较方法名称,但根据这一点,您的列表没有正确排序(例如,“delete”<“GetWidth”)。改用strcmp()或对列表排序

您可以使用
strcasecmp()
比较方法名称,但根据这一点,您的列表没有正确排序(例如,“delete”<“GetWidth”)。改用strcmp()或对列表排序

因为
wxSize_方法
不按不区分大小写的字母顺序排序。
在二进制搜索之前,您应该按
stracecmp
wxSize_方法进行排序。

因为
wxSize_方法
不按不区分大小写的字母顺序排序。 在二进制搜索之前,您应该按
stracecmp
wxSize\u方法进行排序。

谢谢,在bsearch()解决问题之前,使用qsort()和stracecmp()比较!谢谢,在bsearch()解决问题之前,使用qsort()和strcasecmp()比较!
CMP: getwidth = delete? --> 3
CMP: getwidth = op_isub? --> -8
CMP: getwidth = op_iadd? --> -8
CMP: getwidth = op_div? --> -8
CMP: getwidth = op_add? --> -8
RESULT: 0x0