Итак, у меня есть функция C, которая выглядит следующим образом:
int cmp (const void *a, const void* b)
return rot13cmp( (const char*)a, (const char*)b );
}
и rot13cmp — еще одна функция, которая принимает два параметра типа const char *.
Я передаю эту функцию в параметр сравнения для функции C qsort, но это не кажется работать.
Однако, если вместо этого я приведу переменные const void *, выполнив
return rot13cmp ( *(const char **)a, *(const char **)b );
после этого функция начинает работать. Я посмотрел это на SO, но каждый источник сказал, что первый метод приведения должен работать, поэтому я хотел знать, почему у меня работал только второй?
Изменить: вот соответствующий код, который у меня есть,
int cmp (const void *a, const void *b) {
return rot13cmp( (const char *)a, (const char *)b );
}
int rot13cmp (const char *a, const char *b) {
while (*a == *b && *a != '\n') {
a++;
b++;
}
if (*a == *b) { return 0; }
else if (*a == '\n') { return 1; }
else if (*b == '\n') { return 1; }
else { return rot13(*a) - rot13(*b);
}
а rot13 возвращает int для ASCII-кода буквы, повернутой на 13 букв в алфавите.
Я вызвал qsort, выполнив
qsort(words, word_count, sizeof(char*), cmp);
где слова — это массив char**, а word_count — целое число. cmp тоже просто
qsort()
? - person timrau   schedule 08.02.2015a
иb
. Из того, что вы описываете, я бы предположил, что это указатели на указатели, но без информации это чистое предположение. - person Jens Gustedt   schedule 08.02.2015