Consulta argumentos

Iniciado por elProfeta1979, 20 Diciembre 2013, 21:12 PM

0 Miembros y 3 Visitantes están viendo este tema.

elProfeta1979

hay ventajas en hacer este tipo de declaraciones ?


static int
compare (const void *a, const void *b)
{
  return strcmp (*(char **) a, *(char **) b);
}





rir3760

Cita de: elProfeta1979 en 20 Diciembre 2013, 21:12 PMhay ventajas en hacer este tipo de declaraciones?
Primero tienes que indicar en relación a que.

Para dar mas contexto una función de ese tipo se utiliza junto con qsort (parte de la biblioteca estándar de C) para ordenar un array de punteros a carácter:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static int cmp(void const *p, void const *q);

int main(void)
{
   char *pal[] = {
      "xyz",
      "paco",
      "luis",
      "hugo",
      "abc",
   };
   size_t num_pals = sizeof pal / sizeof pal[0];
   size_t i;
   
   qsort(pal, num_pals, sizeof pal[0], cmp);
   for (i = 0; i < num_pals; i++)
      printf("%lu: %s\n", (unsigned long) i, pal[i]);
   
   return EXIT_SUCCESS;
}

static int cmp(void const *p, void const *q)
{
   return strcmp(*(char **) p, *(char **) q);
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

elProfeta1979

por eso mismo, mi pregunta es: ¿sí es una función donde siempre se le pasan cadenas de caracteres para que poner punteros genéricos y luego hacer el cast?

preguntaba si hay alguna ventaja o si, en este caso es lo mismo hacer la función así:

static int
compare (const char *a, const char *b);

con punteros a char

saludos

elProfeta1979


rir3760

Cita de: elProfeta1979 en 21 Diciembre 2013, 18:36 PMmi pregunta es: ¿sí es una función donde siempre se le pasan cadenas de caracteres para que poner punteros genéricos
Porque la función sera llamada por qsort, su prototipo es:
qsort(void *elem, size_t num_elem, size_t elem_size, int (*cmp)(void const *pa, void const *pb))
Con el se indica que el cuarto argumento sera un puntero a función cuyo tipo de retorno es int y sus dos argumentos de tipo "void *", esto para que la función sea genérica ya que no puede saber de antemano el tipo del array a ordenar.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language