Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: huchoko en 26 Febrero 2019, 01:16 am



Título: [C]Es posible tener una funcion en un struct?
Publicado por: huchoko en 26 Febrero 2019, 01:16 am
Es posible (en C) tener una función dentro de un struct? Algo así más o menos:
Código
  1. struct foo
  2. {
  3.    int bar = 3;
  4.    int sumar(int x, int y);
  5. };
  6.  
  7. int sumar(int x, int y)
  8. {
  9.    x += y;
  10. }
  11.  
  12. int main()
  13. {
  14.    struct foo asd;
  15.    int spam = asd.bar;
  16.    asd.sumar(5, 5);
  17.    return 0;
  18. }
  19.  
Escuche que en C++ se podía, pero como lo puedo hacer en C?
La idea seria tener funciones mas organizadas, se podría con POO si estuviera en C++, pero sinceramente me da asco la forma en que se declaran clases en C++  ;-), aparte que solo puedo usar C ahora.
Saludos


Título: Re: [C]Es posible tener una funcion en un struct?
Publicado por: K-YreX en 26 Febrero 2019, 01:35 am
Creo que puramente en C no se puede ya que C no está orientado a objetos como podría estarlo C++.
Decirte que lo que sí puedes hacer es crear un <struct> en C++ y entonces si puedes declarar una función miembro del <struct>.
Pero tienes algunos errores como inicializar la variable y luego tu función no tiene sentido, devuelve un <int> y no tiene ningún <return>...

Te dejo el siguiente código que compilado como un fuente de C++ sí funciona (g++ test.cpp -o test).
Si lo tratas como un fuente C, no va a funcionar (gcc test.c -o test).
Código
  1. #include <stdio.h> // #include <cstdio> para C++ mejor
  2.  
  3. struct foo{
  4.    int x;
  5.    int sumar(int y){
  6.        return x+y;
  7.    }
  8. };
  9.  
  10. int main(){
  11.    foo my_foo;
  12.    my_foo.x = 3;
  13.    printf("%d\n", my_foo.x); // salida: 3
  14.    int suma = my_foo.sumar(5);
  15.    printf("%d\n", suma); // salida: 8
  16. }

No sé si te sirve  :-X


Título: Re: [C]Es posible tener una funcion en un struct?
Publicado por: huchoko en 26 Febrero 2019, 01:38 am
Creo que puramente en C no se puede ya que C no está orientado a objetos como podría estarlo C++.
Decirte que lo que sí puedes hacer es crear un <struct> en C++ y entonces si puedes declarar una función miembro del <struct>.
Pero tienes algunos errores como inicializar la variable y luego tu función no tiene sentido, devuelve un <int> y no tiene ningún <return>...

Te dejo el siguiente código que compilado como un fuente de C++ sí funciona (g++ test.cpp -o test).
Si lo tratas como un fuente C, no va a funcionar (gcc test.c -o test).
Código
  1. #include <stdio.h> // #include <cstdio> para C++ mejor
  2.  
  3. struct foo{
  4.    int x;
  5.    int sumar(int y){
  6.        return x+y;
  7.    }
  8. };
  9.  
  10. int main(){
  11.    foo my_foo;
  12.    my_foo.x = 3;
  13.    printf("%d\n", my_foo.x); // salida: 3
  14.    int suma = my_foo.sumar(5);
  15.    printf("%d\n", suma); // salida: 8
  16. }

No sé si te sirve  :-X
Ah, que pena  :-(, pero talvez me sirva cuando este programando en C++
Gracias  :)


Título: Re: [C]Es posible tener una funcion en un struct?
Publicado por: K-YreX en 26 Febrero 2019, 01:49 am
Siempre puedes usar una función externa  :-X:
Código
  1. // declaracion de la struct
  2.  
  3. int sumar(struct foo my_foo, int y){
  4.    return my_foo.x + y;
  5. }
  6.  
  7. int main(){
  8.    struct foo my_foo;
  9.    my_foo.x = 2;
  10.    int suma = sumar(my_foo, 8); // suma = 10
  11. }


Título: Re: [C]Es posible tener una funcion en un struct?
Publicado por: Loretz en 26 Febrero 2019, 02:31 am
En C (y en C++) una struct puede tener un "puntero a función" como miembro, que no es lo mismo que una "función miembro" por supuesto, pero es la forma que puede usarse en C para asociar comportamiento a una struct.

Va un ejemplo:

Código:
#include <stdio.h>

struct foo {
    int bar;
    int(*pfun)(int, int); // puntero a función que devuelve int y que toma dos ints como parámetros.
};

int sumar(int x, int y)
{
    return x + y;
}

int multiplicar(int x, int y)
{
    return x * y;
}

int main()
{
    struct foo asd;
    asd.bar = 3;
    asd.pfun = &sumar;

    printf("suma = %i\n", asd.pfun(5, 5));

    asd.pfun = &multiplicar;
    printf("producto = %i\n", asd.pfun(5, 5));

    return 0;
}


Título: Re: [C]Es posible tener una funcion en un struct?
Publicado por: CalgaryCorpus en 26 Febrero 2019, 15:59 pm
Para complementar la excelente respuesta de Loretz, los nombres de las funciones funcionan como punteros inicializados y cuyo contenido es la direccion de memoria de esa funcion, por lo que el uso del & es opcional.

Código
  1. asd.pfun = &sumar;  
  2. // tambien puede escribirse sin &
  3. asd.pfun = sumar;