bsearch () в массиве строк в C

Я нашел эту статью очень проницательной:

http://addyosmani.com/blog/taming-the-unicorn-easing-javascript-memory-profiling-in-devtools/

Он широко раскрывает инструменты для разработчиков Chrome и очень хорошо объясняет, как это происходит, когда у вашего приложения возникают проблемы с памятью.

-1
задан Nirmik 14 July 2018 в 00:17
поделиться

1 ответ

Вы не можете передать strcmp() в качестве функции сравнения для bsearch(). Эта функция должна принимать указатели на сравниваемые элементы (в этом случае указатель на указатель на строку, хотя фактический тип аргументов функций должен быть const void *), тогда как strcmp() ожидает указатель на строку , Существует дополнительный слой косвенности, который он не обрабатывает.

Вы не показываете эту функцию, но возможно использовать функцию cstring_cmp(), которую вы используете с qsort().

Первым аргументом функции сравнения bsearch() является указатель, указанный как ключ, второй аргумент - указатель на текущий элемент сравниваемого массива, где с функцией сравнения qsort() оба аргумента являются указателями на элементы. Поэтому, если вы сделаете ключевой аргумент bsearch() указателем на то, что вы ищете, оба будут работать с одной и той же функцией. Другими словами, bsearch(&key, ...) хорош, bsearch(key, ...) - нет. Вы также можете использовать функцию сравнения bsearch(), которая будет работать с этим вторым случаем. См. https://stackoverflow.com/a/15824981/9952196 для примера.

1
ответ дан Shawn 17 August 2018 в 12:05
поделиться
  • 1
    Привет, я просто добавил код для функции cstring_cmp. не могли бы вы взглянуть и сообщить мне, если вы думаете, что это правильно? Я также попытаюсь использовать его в среднее время. – Nirmik 14 July 2018 в 00:17
  • 2
    Я думаю, вы правы. Возможно, это просто решило проблему. Я сделаю более полное тестирование и вернусь. Спасибо! – Nirmik 14 July 2018 в 00:23
  • 3
    @Nirmik, который выглядит как подходящая функция для использования с qsort() с массивом строк, да. Он также будет работать с bsearch(), если элемент, который вы ищете, передается с использованием его адреса (мне нужно вернуться назад и переписать мой ответ, потому что я забыл это оговорку), например bsearch(&key, ...). – Shawn 14 July 2018 в 00:24
Другие вопросы по тегам:

Похожие вопросы: