Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Ayuda para comprender un codigo

Estas en el tema de Ayuda para comprender un codigo en el foro de C/C++ en Foros del Web. Perdon si el titulo no es muy explicito... Estoy dando mis primeros pasos con C, y las dudas las voy resolviendo buscando y buscando, pero ...
  #1 (permalink)  
Antiguo 19/05/2010, 01:05
 
Fecha de Ingreso: febrero-2004
Ubicación: Carthagena
Mensajes: 205
Antigüedad: 20 años, 2 meses
Puntos: 0
Ayuda para comprender un codigo

Perdon si el titulo no es muy explicito...

Estoy dando mis primeros pasos con C, y las dudas las voy resolviendo buscando y buscando, pero en este caso no se como buscar esto, asi que peco de preguntar algo seguramente bastante obvio.

Código:
struct in_UDK k;
void *joyfunc;                // pointer to joystick function

k.fire = in_LookupKey('m');   * fill in keys for key joystick *
k.left = in_LookupKey('o');   * in case it is chosen          *
(etc)
...
joyfunc = in_JoyKeyboard; 
dirs = (joyfunc)(&k);
Este codigo es de la libreria SP1, para lectura de joystick del Spectrum y basicamente lo que hace es crear una estructura de datos, asignar valores (las teclas correspondientes a las direcciones y el boton), luego asigna una funciona a otra funcion (casi seguro de esto) y finalmente lee el joystick, y ahi esta mi duda, ya que la llamada que hace es esto:

Código:
dirs = (joyfunc)(&k);
Lo que no entiendo es que tipo de llamada es esta... comprendo que si se llama una funcion deberia ser algo asi:

Código:
dirs = joyfunc(&k);
Pasando como parametro el puntero de "k".

Alguien puede decirme a que se debe eso de envolver el nombre de la funcion con "( )"???
__________________
Retro Invaders : Mi blog

Última edición por josepzin; 19/05/2010 a las 09:01
  #2 (permalink)  
Antiguo 19/05/2010, 06:51
 
Fecha de Ingreso: febrero-2004
Ubicación: Carthagena
Mensajes: 205
Antigüedad: 20 años, 2 meses
Puntos: 0
Respuesta: Ayuda para comprender un codigo

Voy a simplificar mi pregunta :D

Que tipo de llamada es esta?
Código:
dirs = (joyfunc)(&k);
Normalmente una funcion deberia ser algo asi:
Código:
dirs = joyfunc(&k);
Pasando como parametro el puntero de "k".

Alguien puede decirme a que se debe eso de envolver el nombre de la funcion con "( )"???
__________________
Retro Invaders : Mi blog
  #3 (permalink)  
Antiguo 19/05/2010, 07:55
 
Fecha de Ingreso: mayo-2010
Mensajes: 2
Antigüedad: 14 años
Puntos: 0
Respuesta: Ayuda para comprender un codigo

Normalmente en C si lo rodeas con parentesis es para convertir a un tipo de variable.... es decir...

Si yo pongo

Int Numero;
String Cadena;
Cadena="hola";

Numero=(int)Cadena;

Esto lo que hace es pasar Cadena de String a Entero

Esto en lenguaje de programación se llama Downcasting o Upcasting no me acuerdo ahora muy bien de la diferencia de ambos pero vamos...

Por lo que veo aqui

joyfunc = in_JoyKeyboard;
dirs = (joyfunc)(&k);

joyfunc es un tipo de datos, es decir, es como poner integer o String o algo... es un tipo de dato... entonces por eso esta convirtiendo (&k) a tipo joyfunc

(&k) es un puntero hacia la variable k.... no entiendo muy bien porque es así pero weno.... espero que te sirva
  #4 (permalink)  
Antiguo 19/05/2010, 08:36
 
Fecha de Ingreso: febrero-2004
Ubicación: Carthagena
Mensajes: 205
Antigüedad: 20 años, 2 meses
Puntos: 0
Respuesta: Ayuda para comprender un codigo

Gracias por responder, yo tampoco se bien porque hacen eso, pero espero poder entenderlo :)

Con tu ayuda ya se mas o menos por donde tengo que mirar.
__________________
Retro Invaders : Mi blog
  #5 (permalink)  
Antiguo 19/05/2010, 08:46
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 11 meses
Puntos: 61
Respuesta: Ayuda para comprender un codigo

Opino que no es un cast.
Creo que joyfunc es un puntero a una funcion, que esta siendo asignada primero e invocada despues.

Yo hubiera hecho

dirs = (*joyfunc)(&k);

para hacerlo mas explicito, o bien no haber usado los parentesis, pues opino que no son necesarios ahi, pero esto es mi opinion solamente.

Tal vez si incluyeras la declaracion de joyfunc, quedaria al descubierto que se trata de un puntero a una funcion.
  #6 (permalink)  
Antiguo 19/05/2010, 08:58
 
Fecha de Ingreso: febrero-2004
Ubicación: Carthagena
Mensajes: 205
Antigüedad: 20 años, 2 meses
Puntos: 0
Respuesta: Ayuda para comprender un codigo

La declaracion de joyfunc:
Código:
void *joyfunc;                // pointer to joystick function
Y la otra funcion:
Código:
extern uint __LIB__ __FASTCALL__ in_JoyKeyboard(struct in_UDK *u);
Aunque en esta todavia no entiendo los LIB y FASTCALL del inicio. todavia no llegue ahi! jeje
__________________
Retro Invaders : Mi blog
  #7 (permalink)  
Antiguo 19/05/2010, 09:16
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 11 meses
Puntos: 61
Respuesta: Ayuda para comprender un codigo

El comentario del codigo ("pointer to joystick function") me da la razon, pero la manera de escribir codigo es muy mala, en mi opinion.

Lo que intenta hacer el codigo es asignar un puntero a una funcion y luego invocarla. No se trata de cast.
  #8 (permalink)  
Antiguo 19/05/2010, 09:20
 
Fecha de Ingreso: febrero-2004
Ubicación: Carthagena
Mensajes: 205
Antigüedad: 20 años, 2 meses
Puntos: 0
Respuesta: Ayuda para comprender un codigo

También intenté hacer esto asi tal cual y tampoco me funcionó.
Código:
joyfunc = in_JoyKeyboard;
Probaré de la forma que dices tu.

Graciass
__________________
Retro Invaders : Mi blog
  #9 (permalink)  
Antiguo 19/05/2010, 09:40
 
Fecha de Ingreso: enero-2008
Mensajes: 229
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: Ayuda para comprender un codigo

bien es cierto es un puntero a una función
en C, tu puedes declarar punteros a una función,

la forma es la siguiente

tipo_de_dato_a_retornar (*nombre_funcion)(paremetros);

ej.
Código C++:
Ver original
  1. int (*func)(int x);

- Esto se podria considerar el primer acecamiento a lo que se denominaria polimorfismo.

Posteriormente podrias asignar una funcion con los mismos parametros.
esto esto es por ej.

Código C++:
Ver original
  1. int func1(int x)
  2. {
  3.   return 2*x;
  4. }
  5.  
  6. func = func1;
  7.  
  8. func(x);

Paracera tonto en un principio utilizar esta forma de hacerlo pero es util para cuando tienes varias funciones con los mismos parametros, pero hacen distintas cosas. Ademas como te dije fue un primer acercamiento a los conceptos de la programacion orientada a objetos.
  #10 (permalink)  
Antiguo 19/05/2010, 09:44
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 11 meses
Puntos: 61
Respuesta: Ayuda para comprender un codigo

Desconozco cual es la forma que probaras la asignacion. Lo indicado es para la invocacion, no para la asignacion.

Por otro lado, una cosa es que la asignacion funcione, la invocacion funcione y otro es que el codigo efectivamente haga algo util despues. El flujo editar->compilar->ejecutar ... -> funcionar tiene muchos puntos de falla.
  #11 (permalink)  
Antiguo 19/05/2010, 10:54
 
Fecha de Ingreso: enero-2008
Mensajes: 229
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: Ayuda para comprender un codigo

CalgaryCorpus, no entendi el por k de tu comentario.
  #12 (permalink)  
Antiguo 19/05/2010, 11:30
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 11 meses
Puntos: 61
Respuesta: Ayuda para comprender un codigo

quise decir, que si no te funciona, podria ser por que la funcion que invocas no hace lo que quieres, no necesariamente por errores de compilacion o sintaxis
  #13 (permalink)  
Antiguo 19/05/2010, 15:49
 
Fecha de Ingreso: febrero-2004
Ubicación: Carthagena
Mensajes: 205
Antigüedad: 20 años, 2 meses
Puntos: 0
Respuesta: Ayuda para comprender un codigo

Muchas gracias por la ayuda :)

Al final el codigo quedo algo asi:

Código C:
Ver original
  1. unsigned short int in_Joy2()
  2. {
  3. ...
  4. }
  5.  
  6.  
  7.  
  8.  
  9. unsigned short int joy2;
  10. unsigned short int (*joyfunc2)();
  11.  
  12. joyfunc2 = in_Joy2;
  13.  
  14. joy2 = (joyfunc2)();
  15. if (joy2 & in_FIRE) {
  16.     printf("!");
  17. }
__________________
Retro Invaders : Mi blog
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:55.