Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: elProfeta1979 en 20 Diciembre 2013, 21:12 pm



Título: Consulta argumentos
Publicado por: elProfeta1979 en 20 Diciembre 2013, 21:12 pm
hay ventajas en hacer este tipo de declaraciones ?

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





Título: Re: Consulta argumentos
Publicado por: rir3760 en 21 Diciembre 2013, 00:44 am
hay 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:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. static int cmp(void const *p, void const *q);
  6.  
  7. int main(void)
  8. {
  9.   char *pal[] = {
  10.      "xyz",
  11.      "paco",
  12.      "luis",
  13.      "hugo",
  14.      "abc",
  15.   };
  16.   size_t num_pals = sizeof pal / sizeof pal[0];
  17.   size_t i;
  18.  
  19.   qsort(pal, num_pals, sizeof pal[0], cmp);
  20.   for (i = 0; i < num_pals; i++)
  21.      printf("%lu: %s\n", (unsigned long) i, pal[i]);
  22.  
  23.   return EXIT_SUCCESS;
  24. }
  25.  
  26. static int cmp(void const *p, void const *q)
  27. {
  28.   return strcmp(*(char **) p, *(char **) q);
  29. }

Un saludo


Título: Re: Consulta argumentos
Publicado por: elProfeta1979 en 21 Diciembre 2013, 18:36 pm
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


Título: Re: Consulta argumentos
Publicado por: elProfeta1979 en 21 Diciembre 2013, 18:39 pm
------------


Título: Re: Consulta argumentos
Publicado por: rir3760 en 22 Diciembre 2013, 02:15 am
mi 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:
Código
  1. 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


Título: Re: Consulta argumentos
Publicado por: elProfeta1979 en 22 Diciembre 2013, 02:24 am
gracias

:o