Problema: usar función de una clase en una librería dinámica

Agrupa todas las consultas sobre los lenguajes de programacion como C, C++, Python, Java ...

Problema: usar función de una clase en una librería dinámica

Notapor Ezequiel Pereira » Mar Abr 23, 2013 12:28 am

El ejecutable de mi juego usa librerías dinámicas para ahorrar peso en el ejecutable y que sea fácil de editar.
Pero en una librería necesito usar clases, derivar de las mismas y re-definir una función para hacer personajes "vivos" en mi juego pero tengo un problema.
Carga la librería y se almacena en una lista un objeto que representa a un personaje sin problemas pero al intentar llamar la función "update" de este, el programa falla.
Yo creo que el problema es el "virtual" con el que defino la función pero sin él, update es lo mismo que la nada.

No logro solucionarlo con nada y con GDB no encuentro nada raro, lo único que encuentro es que el error esta en la linea 523 de util.h.

Ver/Descargar código fuente
Avatar de Usuario
Ezequiel Pereira
 
Mensajes: 21
Registrado: Vie Dic 28, 2012 1:51 am
Ubicación: Montevideo, Uruguay

Re: Problema: usar función de una clase en una librería diná

Notapor Barajas » Mié Abr 24, 2013 2:48 am

Ezequiel Pereira escribió:El ejecutable de mi juego usa librerías dinámicas para ahorrar peso en el ejecutable y que sea fácil de editar.
Pero en una librería necesito usar clases, derivar de las mismas y re-definir una función para hacer personajes "vivos" en mi juego pero tengo un problema.


Eso se llama programación dinámica, es decir, crear cosas en tiempo de ejecución, si, entiendo, es un problema común, y más por que para hacerlo se tienen que utilizar punteros...

Ezequiel Pereira escribió:No logro solucionarlo con nada y con GDB no encuentro nada raro, lo único que encuentro es que el error esta en la linea 523 de util.h.


Eso es por que intentas acceder a lugares "oscuros" de la memoria. (a eso se le conoce como "segmentation fault (core dumped) "/"Fallo de segmentación (nucleo volcado)" ) :roll:

Aquí dejare un ejemplo de código que yo he hecho, utilizando vector y que permite utilizar la herencia, si tienes dudas, pregunta. :)

(además, no es por ofender, pero tu código es muy jeroglífico :oops: )

#include <vector>

//creo un vector que contiene apuntadores a la clase Sprite.
//es un apuntador para permitir utilizar la herencia...
//typedef es un viejo truco en c que permite utilizar un alias, en lugar de escribir vector<Sprite*>
//puedo escribir SpriteGrup, que es mucho mas intuitivo. Pero esto solo aplica a tipos de datos.

typedef vector<Sprite*> SpriteGrup;


//creamos un iterador, permite hacer algunos bucles más fáciles...
SpriteGrup::iterator it;


//creo una función para limpiarlo, recuerda, que los punteros no liberan memoria en automático...
void limpia_grupo(SpriteGrup Grupo){
int i;
for(i = 0; i < Grupo.size(); ++i) delete Grupo[i];
};


//defino un grupo para poder trabajar con los Enemigos...
SpriteGrup ENEMIGOS;
//también creo un puntero que me permitirá usar la magia de la herencia de forma dinamica
Enemigo * SPR_ENEMIGO;

//los Enemigos heredan directamente de los Sprites
//pero como los Enemigos siguen siendo Sprites, podemos meterlos en un grupo de Sprites
//de esta manera...

ENEMIGOS.push_back( new Enemigo() );

//o de esta otra...

Enemigo * temp = new Enemigo();
ENEMIGOS.push_back( temp );


//ya en el juego...
for(i=0;i<ENEMIGOS.size();i++){
ENEMIGOS[i]->update();
//update es un método virtual de la clase Sprite. Todos los hijos de Sprite la pueden usar...
//pero enemigo lo redefine, por esto es que esta definida como virtual

//pero para las cosas que solo puede hacer el sus hijos (en este caso, la clase Enemigo *)
//hay que hacer un "cast" (en español seria algo así como "lanzar", "arrojar")
//es decir, indicarle a ese Sprite* que debe convertirse en la clase Enemigo*
SPR_ENEMIGO = (Enemigo *)ENEMIGOS[i]; //recordemos que ENEMIGOS[i] es un Sprite*

//una vez terminado, podemos llamar a los métodos que solo puede usar la clase Enemigo
SPR_ENEMIGO->Hacer_Algo_Que_Solo_Puede_Hacer_El_Enemigo() ;
}

//mas adelante...
//la razón del iterador...
for (it = ENEMIGOS.begin(); it != ENEMIGOS.end(); it++) (*it)->draw_center(pantalla);
//nos ahorra lineas, recordemos que ENEMIGOS contiene Sprites* y "draw_center"
//ese es un método de los Sprites
//lamentablemente, con el iterador no podemos hacer cast para utilizar la herencia.


Espero haber sido lo bastante claro, si no, pregunta.
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Problema: usar función de una clase en una librería diná

Notapor Ezequiel Pereira » Mié Abr 24, 2013 11:02 am

Mi problema no es como usar "virtual" o como redefinir funciones así.
Mi problema es que usando librerías dinámicas (Los ".so") intento redefinir una función que se encuentra dentro de mi código.
Una cosa que intente fue intentar hacer un puntero a una función del .so en mi programa pero al momento de llamar la función, la memoria a la que apuntaba el puntero se volvió inaccesible.

Lo que quiero es definir como actúan los enemigos desde fuera del programa, así pueden hacer variedad de cosas, la memoria solo carga lo necesario y el ejecutable queda pequeño.

Barajas escribió:(además, no es por ofender, pero tu código es muy jeroglífico :oops: )


Jajaja, yo lo entiendo :mrgreen: .
Avatar de Usuario
Ezequiel Pereira
 
Mensajes: 21
Registrado: Vie Dic 28, 2012 1:51 am
Ubicación: Montevideo, Uruguay

Re: Problema: usar función de una clase en una librería diná

Notapor Ezequiel Pereira » Mié Abr 24, 2013 12:06 pm

Ya encontré el problema, era causado por una pequeña linea del código:
dlclose(lib);

Eso hacia que la memoria de la librería quedara inaccesible.
Ahora moví la linea de lugar para que se llame solo al cambiar de sala o al salir del programa.

Gracias por intentar ayudarme Barajas :) .
Avatar de Usuario
Ezequiel Pereira
 
Mensajes: 21
Registrado: Vie Dic 28, 2012 1:51 am
Ubicación: Montevideo, Uruguay


Volver a Sobre lenguajes de programación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron