Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





ejecucion de cadenas de texto

Iniciado por Emotion, 01 de Enero de 1970, 01:00:00 AM

« anterior - próximo »

Emotion

                                Tengo un problema y es que segun mi idea la manera de evitar bucles innecesarios podria ser definir una lista de funciones a ejecutar en cada fotograma, lo que pasa es que no se si esto es factible, quiero decir, lo siguiente:

Imaginad que las estructuras son asi

typedef struct execnode
{
char *str;
execnode *next;
} execstring;

execstring *es = new execnode;

Y al crear un nodo le meto al campo str el valor "glFlush()".

Y lo que hago es lo siguiente:

es->str;

Es decir, se pueden llamar funciones contenidas en cadenas de texto pasando estas como metodo de llamada?
                               
G3: Get the Power!

Gunder

                                Emotion,

directamente no, pero pudes hacer un evaluador de funciones como los q usan los interpretes de scripts.

Me explico:

Usa un tokenizador para averiguar que funcion es y que parametros usas.

Usa una lista enlazada o mejor una tabla hash para guardar el token y un puntero a la funcion deseada asi como un identificador para saber de que tipo es cada parametro, lo necesitaras.

Con este puntero y con los parametros ya convertidos al tipo que necesites, llamas a la funcion en cuestion.

Te recomiendo algo de documentacion sobre scripts.

http://www.gamedev.net/reference/programmi...res/cppscript1/

Saludos.
                               
riticar, critica hasta el mas tonto.

Emotion

                                Ostias que putada, pues me jode todo el proceso de analisis que habia hecho...

o sea que en lugar de eso deberia hacer, por ejemplo, una funcion que me procesara la cadena de texto? algo asi:

execute(es->str);

la verdad es que no recuerdo bien, pero tengo la sensacion de haber visto un ejemplo similar al que yo preguntaba, pero vamos, merece la pena echarle un vistazo a lo del script, si bien no era en lo que estaba pensando exactamente, ya que con lo del script tendria que emplear mucho tiempo en 'decodificar' (digamoslo asi) la cadena y llamar a la funcion correcta :triste:

de cualquier manera, gracias por la respuesta, aunque... no hay una mejor manera de poder resolver ese problema? quiero decir... bueno, a juzgar por mi pregunta, mas o menos sabes lo que quiero hacer, no? es que antes (hace ya tiempo, por supuesto) viendo un codigo fuente de un emulador de SNES, creo... venian las funciones para los mnemonicos contenidas en algo asi como x[] = {_asmnop, _asmsubx, _asm... etc, etc), y por eso tal vez pense que se trataba de ejecucion directa, aunque hubiera que hacer algo asi como list[1];

en fin... habra que probar...

un saludo
                               
G3: Get the Power!

Gunder

                                Esa posibilidad que tu comentas, solo existe en los lenguajes interpretados como puede ser el basic, director, etc. Yo me acuerdo que en el spectrum se podia evaluar una expresion con una funcion ( del nombre de la funcion no me acuerdo ). Pero te informo que el c/c++ nunca puede ejecutar codigo fuente en tiempo de ejecucion si no es con la ayuda de un interprete/evaluador.

El principal problema con el q te encuentras son los parametros de las funciones, ya que cada funcion q puedes llamar pude tener un numero de parametros variables y de tipo distinto.

Respecto al array ese que mencionas del emulador de SNES es a todas luces un array de punteros a funciones para que la maquina virtual del emulador llame a cada funcion segun la instruccion de maquina q encuentre. Mas que nada esto lo usara para evitar una estructura switch.
                               
riticar, critica hasta el mas tonto.

undol

                                Me gustarí decir un par de comentarios sobre lo que dice Emotion. Quizá no sea factible desdel punto de vista que comentas, ya que le evaluación de la cadena ha ejecutar sería en tiempo de ejecución cosa que no es posible ha no ser que utilizaes las técnicas que describen mas arriba ... pero

Has pensado en utilizar Macros para poder engañar al compilador, y esa "traza" de funciones se metan en tiempo de compilación. Creo recordar que en los codigos fuente de sistemas operativos como Minix y Linux se utilizan este tipo de técnicas ... en todo caso no puedo darte un ejemplo clarividente ya que solamente es una idea !

Espero que te sirva
                               
aludos --{Undol}--

Emotion

                                Bueno, gracias a los dos por contestar...

Veras undol, lo que yo trataba de hacer es lo siguiente: Imagina que como un metodo para evitar que en el bucle principal del juego tengas que llamar a tantas funciones, tu defines una lista enlazada con las funciones que se van a ejecutar, de forma que al final de cada frame, o mejor, despues de cada ciclo de ejecucion (completo con audio, video, red, perfiericos y lo que quieras) revisas la lista de forma que si deseas, por ejemplo, desactivar el render (no tiene sentido aparente, pero solo es un ejemplo), pues simplemente o bien marcas la funcion como inactiva o bien la eliminas de la lista de ejecucion. Esa era la idea principal, solo que la lista desde mi punto de vista es capaz de organizar mas cosas.

Lo que pasa es que para que la lista fuese optima se deberia poder llamar a las funciones con texto simple, pero como Gunder dijo y yo comprobe este mediodia cuando llegue a mi casa del trabajo, no se puede hacer de forma directa (sin embargo no probe lo de los token). Sin embargo, se me ocurre que utilizando una tabla de punteros y creando mis funciones de forma que no necesiten parametros de entrada, sino que lo cojan todo de registros almacenados en memoria, pues podria seguir siendo una buena estructura.

De cualquier forma, esto he de pensarlo bien antes de lanzarme con el, ya que no se hasta que punto se puede realizar

Supongo que lo que si podria hacer es llamar a la lista de punteros a funcion utilizando un indice, no Gunder? me explico:

Si tengo ese array de punteros de antes:

long ptr[] = {x,x,x,x,x,x,x,...,x};

En lugar de llamar a la funcion de render por, por ejemplo, renderer->render() podria definir la funcion de render como una macro, algo asi como:

#define RENDERER_RENDER 0

y de esta forma podria luego hacer:

execute(RENDERER_RENDER);

donde la funcion execute haria algo asi como:

ptr[RENDERER_RENDER];

o sigo teniendo el problema del acceso directo??

Saludos
                               
G3: Get the Power!

undol

                                Perdona pero me voy a ir por los cerros de ubeda (que alguien me corrija si me equivoco !!)

Estaba en clase y he pensado en un antiguo proyecto que tengo en mente, creo que podrias derivar tu problema hacia una solucion mas comoda y mas estructurada.

Imaginate que tienes un modulo que gestiona una cola de funciones,(puedes encontrar similitudes con las colas de impresora). Este modulo tiene los tipicos consturctores,consultores,modificadore ... todo esto sobre sus elementos quen son TADS que contienen puntero a funcion , boolean para activo o desactivado + 1 codigo unico (para temas de indexado o otros) .

La cola puede encontrarse ordenada por orden de prioridad de ejecucion,ejemplo (primero funciones a perifericos,movimiento de personajes,renderizado,limpieza de estados , ++)

Si este objeto lo haces visible des de un prinicpio donde todas las clases puedan trabajar sobre el podras montar una especie de gestor de funciones , esto y otras cosas como  por ejemplo redimensionar el problema a n colas, gestor de funciones de perifericos , gestor de multiples renderizados , etc ...

Perdona por la ida de pelota, pero estuve pensando en el tema de las macros y creo que falla bastante en el momento que quieres poner dinamismo !!!

_________________
Saludos --{Undol}--

[ Este Mensaje fue editado por: undol el 2002-04-25 18:38 ]                                
aludos --{Undol}--

Drácula

                                Emotion, me tienes asombrado. ¡Ya tengo ganas de ver tu motor! Por lo menos, será algo totalmente diferente, con esto de las hebras y sistema "a petición", y ahora, gestión de llamadas a funciones.

Yo pienso que sí se podría hacer lo que tu dices, pero no de la forma en la que los has expresado. Tu dices que el programador añadirá en una lista las funciones que desea ejecutar. Creo que el enfoque no debe ser:

AñadirInstrucción("DesactivarRender")

Sino:

AñadirInstrucción(&(void *())DesactivarRender());

(No me acuerdo cómo se referencia a funciones, por lo que probablemente el código de arriba esté mal, pero la idea es lo que cuenta!)

Así tienes resuelto el problema. Pero..¿estás seguro que quieres que trabajen así? Yo lo veo complejo y tedioso. A fin de cuentas, podría hacer:

do
  Render();
  ...Llamar a las funciones que me de la gana

loop

                               
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías

Emotion

                                Bueno, mi idea era mas por el concepto de diseño de juego. me explico:

Imaginate un juego tipo el que sea (en mente tengo ahora mismo metal gear). el juego, logicamente, tiene unas reglas que tu expresas como funciones donde compruebas cosas como:

if climatic.snow == true then soldier->sight_range -= 1*climatic.snowdensity

o algo asi

es decir, para no tener que evaluar todas las reglas de juego en mitad del bucle, yo tengo la idea de permitir que sea el programador el que en un momento determinado cargue las reglas que quiera o simplemente escoja la funcion que debe evaluarse para la condicion dada (lo del codigo de ahi arriba no es nada, mi idea era si la vision del soldado se veria afectada por condiciones climatologicas como niebla/nieve)

en fin, esa es la base de mi planteamiento para la seleccion de funciones

ya se que me he explicado como el culo. lo siento, aun estoy en el trabajo y mi jefe me tiene negro, asi que poco puedo pensar ahora mismo, pero en cuanto llegue a mi casa intentare pensar en un ejemplo mejor y si quieres lo posteo...

un saludo
                               
G3: Get the Power!

RePAnd

                                No se si es lo que estabas buscando exactamente, pero me he encontrado en internet un codigo similar a lo que quieres hacer:
void (*funcion[4])( void ) = { funcion1, funcion2, funcion3, funcion4};

y despues para llamar a una de las funciones hace:

(*funcion[numfuncion])( );

no he probado si funciona, pero me imagino que si.
Un Saludo
                               

Emotion

                                Gracias por la respuesta.

Lo probare tan pronto como pueda librarme de los tediosos procesos de depuracion de mi motor (quien me mandaria hacer un motor? podria haber sido lo que quisiera... jardinero, camarero, pero no... me tuve que hacer programador, para dar por saco :malvado:)

Un Saludo
                               
G3: Get the Power!

Emotion

                                Bueno, de todas formas, he estado pensando en una cosa (aunque mas de uno me apedrearia por pesado :sonriendo:):

esas funciones que van dentro de las llaves como estan definidas:

asi: = {printf(),scanf(),toupper(),...}

o asi: = {"printf();","scanf();",...}

supongo que sera de la primera manera, no?

Si es de la segunda forma, entonces no tengo que calentarme la cabeza con lo de la ejecucion de funciones, pero si es de la primera forma, entonces seguire con la idea que tenia, que era algo asi:

typedef union
{
unsigned char B;
unsigned int W;
unsigned long D;
unsigned __int64 Q;
} PARAMETER;

y luego definir algo asi como:

PARAMETER P0,P1,P2,P3;

de forma que al llamar la funcion pues segun el tipo de parametro pues lo pasaria en sus distintas formas, o sea:

P0.B
P0.W
P0.D
P0.Q

Pero aun tengo que masticar mucho esta idea

De cualquier modo, gracias                                
G3: Get the Power!






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.