Recuerda que en las ciencias un error casi siempere puede tener más de una resoluciones, por lo tanto nosotros te enseñaremos lo más óptimo y mejor.
Solución:
Si ayuda a mantener las cosas claras en su cabeza, el tipo al que debe enviar los punteros en su comparador es el mismo que el tipo original del puntero de datos al que pasa qsort
(que los documentos qsort llaman base
). Pero para qsort
para ser genérico, simplemente maneja todo como void*
independientemente de lo que “realmente” es.
Entonces, si está ordenando un array de ints, entonces pasarás en un int*
(convertido a void*
). qsort te devolverá dos void*
punteros al comparador, que usted convierte a int*
y desreferenciar para obtener el int
valores que realmente comparas.
Ahora reemplaza int
con char*
:
si estás ordenando un array de char*
entonces pasarás en un char**
(convertido a void*
). qsort te devolverá dos void*
punteros al comparador, que usted convierte a char**
y desreferenciar para obtener el char*
valores que realmente comparas.
En su ejemplo, debido a que está utilizando un arrayla char**
que pasas es el resultado de la array de char*
“decayendo” a un puntero a su primer elemento. Como el primer elemento es un char*
un puntero a él es un char**
.
Imagina que tus datos fueran double data[5]
.
Su método de comparación recibiría punteros (doble*, pasado como void*) a los elementos (doble).
Ahora reemplace double con char* nuevamente.
qsort
es lo suficientemente general como para ordenar matrices que consisten en otras cosas además de punteros. Es por eso que el parámetro de tamaño está ahí. No puede pasar el array elementos a la función de comparación directamente, ya que no sabe en tiempo de compilación qué tan grandes son. Por lo tanto, pasa punteros. En su caso, obtiene punteros para char *
, char **
.