Можно ли изменить эту функцию для работы с массивами произвольного типа данных?
Да, вы можете передать обобщенный указатель c void *
и размер одного элемента как параметр, именно так qsort()
обрабатывает любой тип данных ( source ).
Вот рабочий пример:
void transpose(void *result, const void *input, size_t rows, size_t cols, size_t element_size) {
unsigned char *input_ptr = (unsigned char *)input;
unsigned char *result_ptr = (unsigned char *)result;
size_t i, j;
for(i = 0; i < rows; i++) {
for(j = 0; j < cols; j++) {
unsigned char *in = input_ptr + element_size * (cols * i + j);
unsigned char *res = result_ptr + element_size * (rows * j + i);
memcpy(res, in, element_size);
}
}
}
Вы также можете сделать это на месте, используя ту же технику замены, что и qsort()
:
void transpose_inplace(void *input, size_t n, size_t element_size) {
unsigned char *input_ptr = (unsigned char *)input;
size_t i, j;
for(i = 0; i < n; i++) {
for(j = 0; j < i; j++) {
unsigned char *a = input_ptr + element_size * (n * i + j);
unsigned char *b = input_ptr + element_size * (n * j + i);
size_t size = element_size;
while (size--) {
unsigned char tmp = *a;
*a++ = *b;
*b++ = tmp;
}
}
}
}
Я использую n
здесь, поскольку для транспонирования на месте вам нужно квадратная матрица, где rows = cols = n
.