Преобразуйте пустой указатель в указатель на символ, чтобы вы могли выполнить арифметику c над ним. char *
используется потому, что char
является наименьшим типом, а elem_sz
будет кратно sizeof(char)
.
Вам не нужно разыменовывать указатели при вызове comp
и swap
, просто передавайте вычисленные указатели.
Все индексы и приращения необходимо умножить на elem_sz
.
static int lomuto(void *array, int left, int right, size_t elem_sz,
int (*comp) (const void*, const void*)) {
char *arr = array;
void *p = arr + left*elem_sz;
int s = left*elem_size;
for (size_t i = left+elem_size; i<=right*elem_size; i += elem_size) {
if (comp(arr + i, p) < 0) {
s++;
swap(arr + s, arr + i, elem_sz);
}
}
swap(arr + left, arr + s, elem_sz);
return s;
}
Я не проверял сам алгоритм сортировки, чтобы сказать, верен ли он, это просто показывает, как правильно обращаться с указателями.