Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: etcheverrypablol en 4 Marzo 2016, 04:29 am



Título: funcion en c que pueda ser llamada con parámetros de distintos tipos
Publicado por: etcheverrypablol en 4 Marzo 2016, 04:29 am
Hola gente.

Quiero crear una función que tenga parámetros que no restrinjan el tipo de dato que se la pase (ya sea int, char, etc.)

¿Cómo se hace y cómo se llama a este tipo de parámetros que no tiene un tipo en particular?

Por ejemplo:

void Sumar( tipoGenerico x, tipoGnerico y){
      return x+y;
}

Me gustaría que la función Sumar, permita pasarle como parámetro un tipo char, un tipo float o un tipo int.

Busqué en internet pero no pude encontrar nada. :-(


Título: Re: funcion en c que pueda ser llamada con parámetros de distintos tipos
Publicado por: engel lex en 4 Marzo 2016, 04:34 am
espero te sirva

https://en.wikipedia.org/wiki/Template_(C%2B%2B) (https://en.wikipedia.org/wiki/Template_(C%2B%2B))


Título: Re: funcion en c que pueda ser llamada con parámetros de distintos tipos
Publicado por: class_OpenGL en 4 Marzo 2016, 05:25 am
En C no existe la sobrecarga de funciones ni tampoco las plantillas, así que me temo que tu problema en C no tiene solución. En C++ puedes usar la sobrecarga de funciones o las plantillas


Título: Re: funcion en c que pueda ser llamada con parámetros de distintos tipos
Publicado por: etcheverrypablol en 4 Marzo 2016, 05:28 am
Hola class, no esperaba esa respuesta.
Pensé que si se podía. Sé que en pascal no se puede, pero me pareció escuchar en clase que sí en C.


Título: Re: funcion en c que pueda ser llamada con parámetros de distintos tipos
Publicado por: class_OpenGL en 4 Marzo 2016, 15:48 pm
Es una pena, pero así es. Si quieres hacer eso, vete a C++!


Título: Re: funcion en c que pueda ser llamada con parámetros de distintos tipos
Publicado por: MAFUS en 4 Marzo 2016, 16:49 pm
Si son de tipo genérico sí se puede pues C es muy vago a la hora de mirar el tipo de dato que le pasas: eso lo deja en manos del programador. Puede que los compiladores se quejen, pero con un cast explícito evitas que aparezcan los mensajes de alerta.

Creo recordar que en C++ libertades como esta desaparecen.

Código
  1. #include <stdio.h>
  2.  
  3. double suma(double a, double b) {
  4.    return a + b;
  5. }
  6.  
  7. int main() {
  8.    char cha = 2, chb = 3;
  9.    int ia = 4, ib = 5;
  10.    long la = 6, lb = 7;
  11.    float fa = 8, fb = 9;
  12.  
  13.    printf("char  : %d\n", (char)suma(cha, chb));
  14.    printf("int   : %d\n", (int)suma(ia, ib));
  15.    printf("long  : %li\n", (long)suma(la, lb));
  16.    printf("double: %f\n", suma(fa, fb));
  17.  
  18.    return 0;
  19. }
  20.  


Título: Re: funcion en c que pueda ser llamada con parámetros de distintos tipos
Publicado por: class_OpenGL en 4 Marzo 2016, 20:19 pm
Si, pero realmente lo que haces es convertir, por ejemplo, un entero a double, y eso no te lo quita nadie (a quien más le importa es al procesador). Por ejemplo, no podrías pasarle un unsigned long long int, porque literalmente la parte entera no cabe en un double. Siempre vas a estar delimitado por el parámetro, mientras que en C++, usando una simple plantilla, puedes hacer esa función sin problemas (también puedes hacer sobrecarga de funciones)


Título: Re: funcion en c que pueda ser llamada con parámetros de distintos tipos
Publicado por: MAFUS en 4 Marzo 2016, 20:51 pm
Eso sí es cierto. Para emular ese comportamiento C debería usar punteros a void y funciones callback. Así se tendría una función genérica para sumar cualquier tipo de dato.


Título: Re: funcion en c que pueda ser llamada con parámetros de distintos tipos
Publicado por: class_OpenGL en 4 Marzo 2016, 21:17 pm
Se me ha ocurrido que se podría usar una macro:
Código
  1. #define sumar(a, b) a+b
  2.  
  3. #include <stdio.h>
  4.  
  5. int main() {
  6. char cha = 2, chb = 3;
  7.    int ia = 4, ib = 5;
  8.    long la = 6, lb = 7;
  9.    float fa = 8, fb = 9;
  10.  
  11.    printf("char  : %d\n", sumar(cha, chb));
  12.    printf("int   : %d\n", sumar(ia, ib));
  13.    printf("long  : %li\n", sumar(la, lb));
  14.    printf("double: %f\n", sumar(fa, fb));
  15. }

Es cierto que no es una función, pero realiza la operación deseada. Además, en vez de sumar podrías restar, multiplicar, dividir, sacar el módulo... vamos, un sin fin de opciones!

PD.: Te copié el código para ilustrar la macro XD.


Título: Re: funcion en c que pueda ser llamada con parámetros de distintos tipos
Publicado por: etcheverrypablol en 5 Marzo 2016, 16:06 pm
MUCHAS GRACIAS POR sus respuestas.

MAFUS, veo que tu método es de una forma distinta a la que me imaginaba, pero con un casteo, cumple con lo que yo estaba buscando.

Class, tu método se acerca más a lo que yo pensaba, me gustó la idea de declarar una macro.

Queda en cada uno analizar las ventajas y desventajas de cada método. Por el momento han respondido a mi pregunta.

:-)


Título: Re: funcion en c que pueda ser llamada con parámetros de distintos tipos
Publicado por: furciorifa en 15 Marzo 2016, 04:11 am
Podrias usar punteros genéricos y hacer castings y/o uso de punteros a funciones pero esto no es muy común en C, la sobrecarga de valores.


Título: Re: funcion en c que pueda ser llamada con parámetros de distintos tipos
Publicado por: mester en 15 Marzo 2016, 20:54 pm
Hola gente.

Quiero crear una función que tenga parámetros que no restrinjan el tipo de dato que se la pase (ya sea int, char, etc.)

¿Cómo se hace y cómo se llama a este tipo de parámetros que no tiene un tipo en particular?

Por ejemplo:

void Sumar( tipoGenerico x, tipoGnerico y){
      return x+y;
}

Me gustaría que la función Sumar, permita pasarle como parámetro un tipo char, un tipo float o un tipo int.

Busqué en internet pero no pude encontrar nada. :-(
Puedes declarar las variables de la función como void *, por ejemplo:
Código
  1. void mi_funcion(void *s, void *n)
  2. {
  3.  ...
  4. }
  5.  
Y luego la puedes llamar así en caso de que sea el primer valor un char y el segundo un int:
Código
  1. int numero = 20;
  2. char *cadena = malloc(sizeof(char) * 20);
  3. mi_funcion((char *)cadena, (int *)numero);
  4.  


Título: Re: funcion en c que pueda ser llamada con parámetros de distintos tipos
Publicado por: class_OpenGL en 15 Marzo 2016, 23:30 pm
¿Cómo sumaríais después los números? (Es lo que pide el que pregunta XD)


Título: Re: funcion en c que pueda ser llamada con parámetros de distintos tipos
Publicado por: Kaxperday en 15 Marzo 2016, 23:42 pm
¿Cómo sumaríais después los números? (Es lo que pide el que pregunta XD)

En este caso recibe 2 punteros void, y los castea a enteros, accede a su contenido, y los suma, luego hace lo inverso pasa de int a *void que en este caso no vale para nada pero esta bien como ejemplo. Si quiere devolver solo la suma en entero, con una linea de return valdría, sin necesidad de "aux".

Código
  1. void* Sumar(void *x, void *y){
  2. int aux;
  3. aux = *(int*)x + *(int*)y;
  4. return (void*)&aux;
  5. }
  6.  
  7. int a = 3;
  8. int b = 4;
  9. printf("%d", *(int*)Sumar(&a, &b));
  10.  

XD.

Pero mira que fino queda en C++:

Código
  1. template<typename T>
  2.  
  3. T add(T a, T b){
  4. return a + b;
  5. }
  6.  
  7. int a = 3;
  8. int b = 4;
  9. std::cout << add(a, b);
  10.  

Un saludo.


Título: Re: funcion en c que pueda ser llamada con parámetros de distintos tipos
Publicado por: class_OpenGL en 16 Marzo 2016, 00:22 am
Es lo que digo, en C++ se puede hacer con las platillas, pero en C, en tu código, estás presuponiendo que son enteros, mientras que la pregunta pide una función general para sumar entre diferentes tipos


Título: Re: funcion en c que pueda ser llamada con parámetros de distintos tipos
Publicado por: Kaxperday en 16 Marzo 2016, 01:08 am
Es lo que digo, en C++ se puede hacer con las platillas, pero en C, en tu código, estás presuponiendo que son enteros, mientras que la pregunta pide una función general para sumar entre diferentes tipos

Hombre pero en una función eso no se puede hacer.

Se podría crear una clase que almacene variables genéricas y trabajar con ellas con métodos como suma, resta... por ejemplo una clase numero generica y ponerla métodos.

Pero con una función, si la pasas variables genéricas de argumento, no puedes saber con que variable estas tratando (quizás haya alguna manera), al menos a priori.

Saludos.


Título: Re: funcion en c que pueda ser llamada con parámetros de distintos tipos
Publicado por: class_OpenGL en 16 Marzo 2016, 02:14 am
Nunca he dicho que se pudiera XDD He recordado lo que la pregunta pedía!


Título: Re: funcion en c que pueda ser llamada con parámetros de distintos tipos
Publicado por: MAFUS en 16 Marzo 2016, 11:30 am
La función de Kaxperday solo funcionaría para tipos de datos no reales, ya que estos tienen una representación interna diferente.