Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: XorNet en 4 Octubre 2013, 06:54 am



Título: Alguien me ayuda con esta duda? Funciones & Punteros.
Publicado por: XorNet en 4 Octubre 2013, 06:54 am
Hola bueno es que me puse a revisar un código fuente y pues me tope con unas lineas así:
Código
  1. ZGetGame()->ZMyCharacter();
  2. //También con:
  3. ZCharacter()->GetMaxAP;
  4.  

No entiendo por el simple echo de que son funciones con operador flecha apuntando hacia otra función o otra variable, o sea no sé si me explique, si alguien me puede poner un ejemplo fácil de comprender y una explicación, porque la verdad estoy muy ansioso por aprender esto los he visto en casi todo el código y pues *Emoción* xD


Título: Re: Alguien me ayuda con esta duda? Funciones & Punteros.
Publicado por: eferion en 4 Octubre 2013, 08:25 am
A ver, tu tienes una estructura o clase cualquiera:

Código
  1. struct estructura
  2. {
  3.  void (*FuncPtr)();
  4. };

Y por otro lado tienes una función que devuelve un puntero a una estructura de este tipo:

Código
  1. struct structura* Funcion( );

Si quieres acceder a algún miembro de la estructura, dado que es puntero tienes que utilizar el operador '->'. Si devolviese la estructura por valor en vez de por referencia tendrías que utilizar el operador '.' para acceder a los miembros de la estructura.

Si, en concreto, quieres acceder al puntero a función almacenado en la estructura, dicho acceso puede escribirse así:

Código
  1. // primera forma:
  2. Funcion( )->FuncPtr( );
  3.  
  4. // segunda forma:
  5. struct estructura* p_estructura = Funcion( );
  6. p_estructura->FuncPtr( );

Pero vamos, que antes de correr tanto ponte a aprender la base, que estas cosas ya irán llegando solas.

Un saludo.


Título: Re: Alguien me ayuda con esta duda? Funciones & Punteros.
Publicado por: XorNet en 4 Octubre 2013, 15:52 pm
A ver, tu tienes una estructura o clase cualquiera:

Código
  1. struct estructura
  2. {
  3.  void (*FuncPtr)();
  4. };

Y por otro lado tienes una función que devuelve un puntero a una estructura de este tipo:

Código
  1. struct structura* Funcion( );

Si quieres acceder a algún miembro de la estructura, dado que es puntero tienes que utilizar el operador '->'. Si devolviese la estructura por valor en vez de por referencia tendrías que utilizar el operador '.' para acceder a los miembros de la estructura.

Si, en concreto, quieres acceder al puntero a función almacenado en la estructura, dicho acceso puede escribirse así:

Código
  1. // primera forma:
  2. Funcion( )->FuncPtr( );
  3.  
  4. // segunda forma:
  5. struct estructura* p_estructura = Funcion( );
  6. p_estructura->FuncPtr( );

Pero vamos, que antes de correr tanto ponte a aprender la base, que estas cosas ya irán llegando solas.

Un saludo.

Oye y este método cómo se llama? O sea que nombre se  le da a este tipo de instrucciones, me explico a las funciones así:
Código
  1. void funcion1(int prueba, ...);
  2.  
Se les denomina Funciones Variadicas, entonces cómo se le denomina a esto que trato de entender?


Título: Re: Alguien me ayuda con esta duda? Funciones & Punteros.
Publicado por: rir3760 en 4 Octubre 2013, 16:10 pm
cómo se le denomina a esto que trato de entender?
Es solo una función que retorna un puntero, no tiene un nombre especial.

Un saludo


Título: Re: Alguien me ayuda con esta duda? Funciones & Punteros.
Publicado por: ivancea96 en 4 Octubre 2013, 16:15 pm
Sencillamente, si tienes un objeto de una clase en u variable, lo llamas con "clase.funcion/variable". Si el estás tratando con un puntero a esa clase, es con "clase->funcion/variable".
Por cierto,
Se les denomina Funciones Variadicas
Función Variadica? De donde sacaste eso?
En mi vida lo oí xD


Título: Re: Alguien me ayuda con esta duda? Funciones & Punteros.
Publicado por: rir3760 en 4 Octubre 2013, 16:34 pm
Por cierto,Función Variadica? De donde sacaste eso?
En mi vida lo oí
Son las funciones que reciben un numero variable de argumentos, por ejemplo printf o scanf. Mas información en la pagina (cortesía de Wikipedia) Variadic function (http://en.wikipedia.org/wiki/Variadic_function).

Un saludo


Título: Re: Alguien me ayuda con esta duda? Funciones & Punteros.
Publicado por: ivancea96 en 4 Octubre 2013, 16:48 pm
Ah, al ponerle la 'a' no me fijé xD
Nunca usé esa librería la verdad.
Prefiero usar sobrecarga.


Título: Re: Alguien me ayuda con esta duda? Funciones & Punteros.
Publicado por: XorNet en 4 Octubre 2013, 19:55 pm
Bueno hasta ahora he tratado de entender pero pues no lo he logrado xd, cuando trato de compilar esto:
Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. class Prueba {
  6. public:
  7. void saludo() { cout << "Saludo desde la función!\n"; }
  8. Prueba() { }
  9. };
  10.  
  11. int main() {
  12. Prueba* pPrueba( );
  13.  
  14. pPrueba()->saludo();
  15.  
  16. system("pause>nul");
  17.  
  18. return 0;
  19. }
  20.  
Pero me da error, alguien me dice porque? Es obvio que lo estoy haciendo super mal pero por eso pongo el código para saber porque y me orienten.


Título: Re: Alguien me ayuda con esta duda? Funciones & Punteros.
Publicado por: eferion en 4 Octubre 2013, 20:12 pm
Código
  1. Prueba* pPrueba( );

Esta línea está mal.

Los objetos se pueden crear, bien de forma estática:

Código
  1. Prueba pPrueba( );

Bien de forma dinámica:

Código
  1. Prueba* pPrueba = new Prueba( );

Pero lo que tu has puesto es una forma híbrida que no funciona.

Por cierto, si creas un objeto con new... recuerda que has de poner un delete cuando dejes de usarlo... si no vas a dejar tu programa plagado de lagunas de memoria.

Código
  1. int main() {
  2. Prueba* pPrueba = new Prueba( );
  3.  
  4. pPrueba()->saludo();
  5.  
  6.        delete pPrueba( );
  7.  
  8. system("pause>nul");
  9.  
  10. return 0;
  11. }


Título: Re: Alguien me ayuda con esta duda? Funciones & Punteros.
Publicado por: ivancea96 en 4 Octubre 2013, 20:16 pm
2 cosas:

1)
Código
  1. Prueba* pPrueba = new Prueba();
Eso solo era un puntero. Tienes que asignarle una variable. (new ...)

2) Pusiste "pPrueba()->saludo();
La variable no tiene paréntesis.


Título: Re: Alguien me ayuda con esta duda? Funciones & Punteros.
Publicado por: XorNet en 5 Octubre 2013, 00:04 am
xd Creo que no me supe explicar, cuando tenemos:
Código
  1. ZGetGame()->ZMyCharacter();
  2.  

Porqué ZGetGame() Tiene paréntesis? Qué es lo que los hace tener? Sí es un objeto puntero de una clase bastaría con: ZGetGame->ZMyCharacter(); Y así el objeto llama a la función ZMyCharacter(), Pero porqué ZGetGame tiene paréntesis?


Título: Re: Alguien me ayuda con esta duda? Funciones & Punteros.
Publicado por: ivancea96 en 5 Octubre 2013, 00:27 am
Eso es que ZGetGame() es una función que retorna un objeto. ZMyCharacter() es una función del objeto retornado.


Título: Re: Alguien me ayuda con esta duda? Funciones & Punteros.
Publicado por: XorNet en 5 Octubre 2013, 01:04 am
Eso es que ZGetGame() es una función que retorna un objeto. ZMyCharacter() es una función del objeto retornado.

Heheheh al fin lo entendí. xP O sea que el código correcto al que coloqué anteriormente es este:
Código
  1. #include <iostream>
  2. #include <cstdlib>
  3.  
  4. using namespace std;
  5.  
  6. class Prueba {
  7. public:
  8.    void saludo() { cout << "Saludo desde la funcion!!\n"; }
  9.    Prueba() { }
  10. };
  11.  
  12. Prueba* pPrueba() {
  13.    Prueba ejemplo1;
  14.    return &ejemplo1;
  15. }
  16.  
  17. int main() {
  18.  
  19.    // ...
  20.  
  21.    pPrueba()->saludo();
  22.  
  23.    // ...
  24.    Prueba* prueba2 = pPrueba();
  25.    prueba2->saludo();
  26.  
  27.    system("pause>nul");
  28.  
  29.    return 0;
  30. }
  31.  

Al fin lo entiendo sé que no es la gran cosa pero me servirá. (:


Título: Re: Alguien me ayuda con esta duda? Funciones & Punteros.
Publicado por: rir3760 en 5 Octubre 2013, 02:22 am
En esta función:
Código
  1. Prueba* pPrueba()
  2. {
  3.   Prueba ejemplo1;
  4.   return &ejemplo1;
  5. }
Estas retornando la dirección de una variable local, no es valido ya que todas las variables locales se destruyen al finalizar la función.

Para que compile sin problemas puedes calificar la variable "ejemplo1" con static, de esa forma la variable existe durante toda la duración del programa:
Código
  1. Prueba* pPrueba()
  2. {
  3.   static Prueba ejemplo1;
  4.   return &ejemplo1;
  5. }

Con todo el ejemplo solo tiene caso (sentido) para practicar el uso de funciones y sus valores de retorno.

Un saludo