Задача - написать универсальную функцию бинарного поиска и сортировки вставками для любого типа данных с передачей в нее адреса функции сравнения (для разных типов данных).
Имеется массив структур а и массив индексов р:
DB *a=new DB[n]; //массив структур
DB **p=new DB*[n]; //массив индексов
for (i=0; i<n; i++)
p[i]=&a[i];
int ComYearI (DB *a, int *b) //функция сравнения
{
return a->y-*b;
}
int BinSearch(void *k, void **a, int n, size_t w, int (*fcmp)(const void*, const void*)) //функция поиска
{
int l = 0, r = n - 1, m;
while (l <= r)
{
m = (l + r) / 2;
if ( fcmp (a[ m*( sizeof (w) )], k ) == 0)
return m;
.......//тут идет продолжение, но думаю сейчас оно несущественно
s=BinSearch ((void*)&y, (void**)p, n, sizeof (DB), (int(*)(const void *, const void *))ComYearI); //вызов функции поиска
Сама проблема: в функцию поиска массив индексов передается корректно, в функцию сортировки - нет.
Пытался передавать так:
int ComYearI (DB a, int *b)
fcmp (*a[ m*( sizeof (w) )], k )
Но компилятор ругается...
Примечание:
>Я бы тоже ругался, сильно :)
не надо, я хороший, просто учусь еще)
>* перед "a" не нужно
без нее передается не адрес, а какая-то фигня. А с ней не компилируется. Хотя следующий код отлично работает:
int ComYear (DB a, DB b){
return a.y-b.y;
}
int BinSearchYear(DB **a, int n, int k)
{
int l = 0, r = n - 1, m;
while (l <= r)
{
m = (l + r) / 2;
if (ComYearI(*a[m], k)==0)
return m;
......
Но тут есть привязка к типу данных... DB - это структура, если что.
>Но самое главное, если пишите на C++, зачем такая жесть с указателями?
Знаю про шаблоны,сначала написал на них. Преподаватель требует так писать(
>да хоть Сишный bsearch на крайний случай
На его вызове и основывался когда писал (просто вызвать не прокатит). Сам исходник функцию не нашел, иначе благополучно бы уже скоммуниздил)
Просто подскажите где я с указателями запарился. Нужно чтобы из функции сравнения было доступно содержимое структуры а. Все что пробовал либо не компилируется, либо не работает.
Примечание:
Огромное спасибо, почему-то не догадался что можно передать функцию через тэмплэйты)
Учиться, учиться и еще раз учиться мне еще)
RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.
Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.
Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.