создание универсальной функции поиска для несортированного универсального массива - PullRequest
1 голос
/ 28 января 2012

Я создаю свою личную универсальную библиотеку с функциями и структурами данных в C.

У меня есть универсальный вектор

typedef struct vector
{
  int max;
  int size;
  void **data;
} vector_t;

, и я создал функции для вектора:

int vector_new( vector_t * v, int vecsize );
int vector_add( vector_t *v , void *elem );
int vector_remove( vector_t * v, void *elem);
void vector_free( vector_t *v );

В реализации функции remove я добавляю элемент тогда и только тогда, когда элемент еще не присутствует в массиве данных.Я создал функцию search (потому что я не хочу сортировать вставляемый элемент) для поиска возможных дубликатов.

Что ж, у меня есть сомнения относительно типа первого параметра, которыйЯ должен перейти к функции.Я хочу создать функцию search не только для этого использования, но и для общего использования.

В remove () я назвал ее так: search(v->data, elem);, но каким будет прототипфункция?

int search( ??? , void * e );

Я знаю, что первый параметр может быть массивом.Но я не знаю, например, void* или void**.
Важно то, что эта функция работает не только для структуры и функций, которые я создала.

Ответы [ 2 ]

1 голос
/ 28 января 2012

Похоже, вам нужно определить указатель функции для сравнения элементов в векторе на равенство. Затем его можно добавить в качестве параметра в метод поиска

typedef bool (*vector_equals)(void* pLeft, void* pRight);
int vector_search(vector_t* v, vector_equals callback);

Теперь допустим, что у меня был вектор, который содержал int значений. Я мог бы определить свой обратный вызов как

bool vector_int_equals(void* left, void* right) {
  int* intLeft = left;
  int* intRight = right;
  return *left == * right;
}
0 голосов
/ 28 января 2012

Я бы сделал int search(void **array, unsigned int size, void *data);.
Это потому, что вы всегда выполняете поиск по массиву указателей (неважно, к чему), поэтому массив void * выглядит правильно.

Вы также можете подумать, что сравнение сделано.Если это простой == между указателями, это довольно просто.Но если вам нужно что-то еще, это может быть сложнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...