bsearch и struct (пользовательский тип) - PullRequest
3 голосов
/ 08 февраля 2012

У меня есть такой массив:

typedef struct INSTR
{
    char* str;
    int  argc;
} INSTR;
const static INSTR instructions[] = { {"blue",1}, {"green",2} };

, затем я попытался сделать bsearch, но я получаю сообщение Segmentation fault:

int comp(const void *a, const void *b)
{
    const INSTR *aa = (INSTR*)a;
    const INSTR *bb = (INSTR*)b; 
    // if I "return 0;" here i get no error.
    return strcmp(aa->str, bb->str);
}

.

char *str = get_string(src_buff, size);
bsearch(str, instructions,
        sizeof(instructions) / sizeof(instructions[0]),
        sizeof(instructions[0]), comp);

Ответы [ 3 ]

3 голосов
/ 08 февраля 2012

Функция comp() неверна. С здесь :

Компаратор Функция, которая сравнивает два элемента. Функция должна следовать этому прототипу:

int comparator ( const void * pkey, const void * pelem );
The function must accept two parameters: the first one pointing to the
key object, and the second one to an element of the array, both
type-casted as void*. The function should cast the parameters back to
some data type and compare them.

Первый аргумент для вашего comp() это const char*, а не INSTR*.

Изменить на:

int comp(const void *a, const void *b)
{
    const INSTR *bb = (INSTR*)b; 
    return strcmp((const char*)a, bb->str);
}

Или замените key на INSTR* вместо const char*.

3 голосов
/ 08 февраля 2012

Вы передаете переменную с именем str в качестве ключа, но в функции сравнения вы рассматриваете ее как INSTR. Если ваш ключ является строкой, тогда a должен быть указателем на нее, и вы должны использовать

return strcmp(a, bb->str);

Это основано на предположении, что str на самом деле является строкой, но мы не можем быть уверены, не увидев ее объявленной (я предполагаю, что это так, если у вас нет довольно необычных соглашений об именах).

EDIT:

На основании обновления является строкой.

2 голосов
/ 08 февраля 2012

Первый аргумент вашей функции comp будет аргументом, который вы передали в качестве первого аргумента bsearch, а не INSTR.Ваша функция сравнения должна действовать соответственно:

int comp(const void *a, const void *b)
{
    const char* str = (const char*)a;
    const INSTR *bb = (INSTR*)b; 
    // if I "return 0;" here i get no error.
    return strcmp(str, bb->str);
}
...