Передача указателя нв указатель типа void в функцию

программирование с++

Задача - написать универсальную функцию бинарного поиска и сортировки вставками для любого типа данных с передачей в нее адреса функции сравнения (для разных типов данных).
Имеется массив структур а и массив индексов р:
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 на крайний случай
На его вызове и основывался когда писал (просто вызвать не прокатит). Сам исходник функцию не нашел, иначе благополучно бы уже скоммуниздил)
Просто подскажите где я с указателями запарился. Нужно чтобы из функции сравнения было доступно содержимое структуры а. Все что пробовал либо не компилируется, либо не работает.

Примечание:
Огромное спасибо, почему-то не догадался что можно передать функцию через тэмплэйты)
Учиться, учиться и еще раз учиться мне еще)
Ответы:
>Но компилятор ругается...
Я бы тоже ругался, сильно :)
Например простой пример сортировки с шаблонами
template <class T, class U>
T foo(T begin, T end, U cmp) {
   while(begin < end) {
       if(cmp(*begin, *begin+1) == 0) //...
       // ...
       begin++;
   }
}


14 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.