У меня есть аналогичная «общая» процедура, такая как qsort, которая имеет указатель на void (указывая на массив), а также параметр указателя функции. Эта функция должна работать на любом типе массива.Как пересечь параметр массива как указатель void
Пример:
void do_something(void * array, int count, int size, void (*test)(const void*)){
int i;
for(i=0; i<count; i++){
test(array + (index * size));
}
}
Это, однако, дает мне следующее предупреждение (ССАГПЗ test.c -pedantic-ошибки):
error: pointer of type ‘void *’ used in arithmetic [-Wpedantic]
И после некоторых исследований я узнал, что это плохая практика используйте указатели void как это. (Например, Pointer arithmetic for void pointer in C)
Итак, как стандартная библиотека делает такие вещи, как qsort? Глядя на этот код: (http://aturing.umcs.maine.edu/~sudarshan.chawathe/200801/capstone/n/qsort.c), я вижу следующее:
void
_quicksort (void *const pbase, size_t total_elems, size_t size,
__compar_fn_t cmp)
{
register char *base_ptr = (char *) pbase;
....
char *lo = base_ptr;
char *hi = &lo[size * (total_elems - 1)];
...
}
Они литья до (символ *), независимо от фактического типа?
Ну, используя _char_, не больше, независимо от типа, чем с помощью _void_ :) Arthmetic on char выполняет задание (перемещайтесь с шагами _size_). – hexasoft