Posible nueva funcion de manejo de memoria dinamica

Started by kim-elet-o, October 16, 2008, 11:18:55 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

kim-elet-o

Estoy usando tecnicas de memoria dinamica en un proyecto que estoy realizando (ese machacamarcianos), y estoy reestructurando el sistema de almacenaje de los datos de los enemigos, tenia un sistema de lista enlazadas tamaño de datos fijos, y ahora voy empezar a emplear listas enlazadas de datos variables, y me he dado cuenta que haria falta una instruccion que nos diera el tamaño de una area de memoria dinamica anteriormente definida en otra parte del programa, por si caso me he bajado la wip 13, para ver si habia ya definida una funcion que hiciera esto, no se si MEM_TOTAL() o MEM_AVAILABLE(), se encargan de esto, pero me parece que por sus nombres, que no son las funciones que busco, se usa el SizeOf aplicado a una variable de caracter dinamico para estos menesteres?, de todas formas si no existe tal funcion y se cree que no es necesaria, ya tengo una tercera via pensada para soluccionar mi problema, gracias.
|/
|\im-elet-o el yayo programador.

SplinterGU

el tamaño de la memoria que se aloca es a requerimiento del programador y por ende este sabe el tamaño de las cosas que aloca... asi trabaja C y tambien Bennu... yo no creo que sea necesaria esta funcion porque contradice un poco el standard al respecto, pero sin embargo, quizas tu problema tenga solucion con la libreria de sandman, su libreria reemplaza al alloc, free y otras funciones mas de bennu y da facilidades como para no pasarse del tamaño alocado, verificar que se liberen o que lo que se quiera liberar este alocado, obviamente esto consume algo de cpu extra, pero el tiene en su lib todos los datos que te vendrian de maravillas... te sugiero revises su dll o incluso le sugieras a el este cambio...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

kim-elet-o

Ok, voy a darle un vistazo la dll de Sandman, y si no encuentro lo que busco en ella, añadire una variable mas en las fichas de los datos que guarde el tamaño de la parte dinamica, gracias por contestar.
|/
|\im-elet-o el yayo programador.

SplinterGU

Quote from: kim-elet-o on October 17, 2008, 08:18:46 AM
Ok, voy a darle un vistazo la dll de Sandman, y si no encuentro lo que busco en ella, añadire una variable mas en las fichas de los datos que guarde el tamaño de la parte dinamica, gracias por contestar.

Bueno, eso es lo que siempre se suele hacer en estos casos, un elemento size en las estructuras.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Danielo515

De verdad que a mi me flipa lo que se os ocurre hacer con la memoria dinámica.
Yayo, si no es mucho preguntar, ¿para que o cómo la usas exactamente? es que a mi nunca se me ha ocurrido como usar memoria dinámica o definiciones de nuevos tipos de datos de un modo util la verdad, siempre para los casos típicos. De hecho, no veo la diferencia entre los tipos de datos definidos y las estructuras. venga, un saludo a todos

kim-elet-o

Jejejeje cuando eres un "yayo" en el mundo de la programacion, la memoria dinamica te salva el culo en muchas situaciones, te voy a poner un ejemplo muy sencillo, imaginate que haces un editor de texto en fenix, y lo que vas tecleando en pantalla lo guardas en memoria, cuando empiezas a programar la solucion inmediata es hacer un array de caracteres de un tamaño fijo, por ejemplo un array que tenga tantos elementos como caracteres se puedan representar en pantalla (80x40 chars por ejemplo), pero que pasa si el texto que necesitas teclear ocupa 2 o 3 o 100 paginas (80x40x100 chars), uuufff un array enorme, pero el pc lo soporta sin problemas, pero que pasa si despues de crear la utilidad cuando la usas a veces tienes que editar textos de un par o 3 lineas, pues que solo usas una porcion pequeña de dicho array, el resto es memomoria inutil que el ordenar podria estar usandola en cualquier otra cosa, o incluso tu programa podria estar usandola en otra cosa que necesitara hacer, en cambio si usas memoria dinamica, puedes definir arrays de tamaños variables, los cuales se adapten al tamaño del texto introducido, sin desperdiciar de este modo valiosa memoria ram, y a la vez adaptas tu programa para que pueda manejar cualquier tamaño de texto, siendo el limite la cantidad de memoria libre en ese momento, y si ademas utilizas metodos de paginacion en disco duro, ni te cuento, espero haberte aclarado un poco tus dudas.

Para aprender a usar memoria dinamica, busca en la red temas como listas enlazadas, y demas derivados.

|/
|\im-elet-o el yayo programador.

HaCkZJuaNN

#6
No sé cómo osas decir que definir nuevos tipos de datos no es útil... Yo lo hago en prácticamente todos los programas que hago. Por una parte te permite mantener el orden, pero también tiene mucha utilidad y hace el código más intuitivo.

Imagínate que tienes un juego donde hay monstruos. Cada monstruo tiene una serie de características, que pueden ser muchas:(vida, dano, alcance, nombre, rango de visión, experiencia adquirida al matarlo, sonidos que utiliza, gráficos que utiliza, resistencias, etc....). Claro, tu al definir el proceso monstruo podrías definirlo con una retahila enorme de argumentos para cada una de sus características:

process monstruo(int vida, int dano, int alcance, string nombre, int ranvis, int exp,....)

pero es mucho más sencillo hacer un tipo definido type monstruo:

type monstruo
int vida
int dano
...
end

y luego hacer el process monstruo así:

process monstruo(monstruo caracteristicas)

y le estás pasando los mismos datos, y además se entiende mejor...

además, imagínate que cuando estás a mitad de desarrollo de tu juego se te ocurre añadirle una nueva característica a los monstruos. Si lo hicieras como antes, tendrías que andar buscando todos los sitios donde llamas a un proceso monstruo y añadirle esa nueva característica(porque puede haber muchos monstruos del mismo tipo). Si lo haces con tipos definidos solo tienes que modificar la declaración del type y las características de cada TIPO de monstruo, no de cada monstruo concreto. Con tipo de monstruo me refiero a:
lobo, orco, dragón, robot asesino o lo que sea; pero no al lobo que hay en tal pantalla en tal punto, sino a los lobos en general...

La diferencia entre los tipos definidos y las estructuras es que las estructuras solo hay una, es una variable en sí misma(otra cosa es que sea un array, pero sigue siendo una sola variable); mientras que los tipos son eso, un tipo, del que puedes hacer muchas variables, igual que puedes tener muchos ints o muchos floats.

Edit: Si esto está muy fuera de lugar, quitadlo :P

Danielo515

A veces creo que mi forma de preguntar las cosas me hace parecer mucho más cateto de lo que en realidad soy. Conozco la utilidad de la memoria dinámica, de hecho he hecho varias aplicaciones de agenda con listas enlazadas simples y dobles en c, y claro, para un editor de textos no queda otra que usar memoria dinámica, eso lo comprendí hace tiempo, igual que para un editor gráfico o de tiles. Eso sí que lo tengo claro, donde no seme ocurre su imprescindibilidad (palabrejo inventado) es en los videojuegos, donde casi siempre hay un número conocido y controlado de elementos, enemigos y demás. Es ahí donde quería incidir sobre para que la usais vosotros, porque yo la uso para programas de estos chorras infinitos como calcular números primos y tonterías de estas.

Lo de los tipos definidos es un concepto un poco más abstrapto y me cuesta un poco más, eso si es cierto, en cierto modo  yo creo que es porque se parece en algunas ideas a la POO, y se me sigue escapando de alguna manera. En el ejemplo de HACKZJUAN, supongo que inicializarias las distintas variables de la variable monstruo, y luego en el process declaras una variable del tipo monstruo que ya trae inicializadas la mayoría de sus variables si no todas, lo que no se es, si la sentencia que has puesto
es la declaración de monstruo ¿cuando lo llames haces monstruo() o monstruo(1,2,3579,159...), si lo he entendido bien no debería ser necesario.

GRACIAS A TODOS (si, a todos)

SplinterGU

No se realmente si el ejemplo de los monstruos es el mas adecuado, pero imaginate por ejemplo, que tus datos y cantidad de enemigos, objetos, tiles, dimensiones de los niveles, etc. los cargas desde un archivo de datos y no los tenes predefinidos en codigo... entonces en ese caso conviene usar memoria dinamica (aunque en algos casos la reserves solo 1 vez) y no estar reservando un tamaño predefinido y rigido desde codigo... o tambien imaginate un algoritmo de IA (uno importante) donde no te bases solo en reglas definidas por codigo, sino que vas aprendiendo con el uso o con cada juego, en este caso es util usar memoria dinamica... ni que hablar que el motor internamente la usa constantemente para manejar recursos como ser strings, mapas, fpgs, blendop, paletas, procesos, etc... y con esto quiero decir que perfectamente vos podes tambien manejar recursos propios desde codigo Bennu y necesites usar memoria dinamica para eso...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

animanegra

Creo que lo que le pasa a danielo es que no le hace falta los nuevos tipos de datos ni las variables dinamicas porque hace uso de fenix como si fuese orientado a objetos. Si tu creas un proceso nuevo cada vez que quieres hacer un nuevo elemento que usarias en una por ejemplo lista enlazada y dentro defines variables locales que serian los parametros de la estructura estas usando algo asi como una lista enlazada formada por procesos. Si ademas se guarda en una tabla mas o menos grande los identificacores, o accede a ellos con el exists directamente se le puede llegar a dar un uso parecido. Accedes a las variables de cada proceso a traves del identificador y usas sus variables internas como elementos.

El unico problema que le veo a eso es la carga de memoria adicional por el peso que puede sufrir el sistema por los procesos de mas ¿no?
"PoCoYo es dios!!"

Danielo515

Quote from: animanegra on October 18, 2008, 12:43:51 PM
Creo que lo que le pasa a danielo es que no le hace falta los nuevos tipos de datos ni las variables dinamicas porque hace uso de fenix como si fuese orientado a objetos. Si tu creas un proceso nuevo cada vez que quieres hacer un nuevo elemento que usarias en una por ejemplo lista enlazada y dentro defines variables locales que serian los parametros de la estructura estas usando algo asi como una lista enlazada formada por procesos. Si ademas se guarda en una tabla mas o menos grande los identificacores, o accede a ellos con el exists directamente se le puede llegar a dar un uso parecido. Accedes a las variables de cada proceso a traves del identificador y usas sus variables internas como elementos.

El unico problema que le veo a eso es la carga de memoria adicional por el peso que puede sufrir el sistema por los procesos de mas ¿no?

LA verdad animanegra, que no hago lo que dices, pero es una buena idea, ja ja ja, quizá algún día tu mismo uses una idea tuya que tuviste pensando que era mía, ja ja ja. No, lo que pasa es que al menos para los juegos que uso yo no veo necesidad de usar memória dinámica. Cargo los gráficos que voy a necesitar cuando los voy a necesitar y los descargo después (ya se que eso es memoria dinámica pero no la gestiono yo, sino bennu) y nunca he tenido la necesidad de guardar indeterminados elementos en ninguna parte. Quizá el día que haga un juego de estrategia y no quiera ponerle límite al numero de unidades me haga falta, pero mientras...

Lo de los monstruos, la explicación que necesitaba era la de los tipos definidos por el usuario, que no se si las variables viene inicializadas, si a un proceso que en su declaración tiene una variable predefinida como parámetro hay que pasarle algún parámetro de inicialización, etc. Pero gracias splinter por la explicación. Aún así esos conceptos de momento son mayores que mis proyectos, pero ya caerán ya...

TYCO

Danielo515:
Imagina que haces un "proyecto" que consiste en una simple pizarra para dibujar en ella con el raton (cuando haces click en ella), y quieres tener la opcion de "Deshacer (undo)".

Cuando haces "click" con el raton... empezarias a pintar en la pizarra... y claro... para poder hacer un "Deshacer" debes ir guardando las posiciones(x,y) de los pixeles donde el raton va pintando en la pizarra.

¿Qué ocurre? que tú puedes soltar el ratón... en cualquier momento... pero no necesariamente cuando muevas "X" veces el ratón, entonces un array estatico para guardar las posiciones no te serviria, necesitarias ir aumentado el tamaño de los arrays para que pueda ir guardando las posiciones por donde pasa el raton sin soltar el "CLICK".

Ejemplo: Con dos variables "valor_x[20]" y "valor_y[20]" para ese sistema de "Deshacer" solo podrias guardar 21 puntos/movimientos del ratón entre un "deshacer" y otro. Con unos dinámicos, irias ampliando ambos arrays para ir guardando más coordenadas hasta que dejaras de pulsar el boton de raton.

Te preguntas entonces: ¿Por qué no hago directamente dos fijos? como... valor_x[1000] y valor_y[1000]. La respuesta creo que ya está más que contestada... pero es lógico que AUNQUE no llegues nunca a usar 1000 coordenadas para el "deshacer" es un gasto inutil de memoria y no seria la mejor forma de programar.
Programador, Escritor/Guionista y Deportista.

Todo Modo Gráfico tiene por detrás una Línea de Comandos.

SnowCraft Remake (100%)
Rally Mortal (87%)

HaCkZJuaNN

#12
Quote from: Danielo515 on October 18, 2008, 12:01:30 PM
Lo de los tipos definidos es un concepto un poco más abstrapto y me cuesta un poco más, eso si es cierto, en cierto modo  yo creo que es porque se parece en algunas ideas a la POO, y se me sigue escapando de alguna manera. En el ejemplo de HACKZJUAN, supongo que inicializarias las distintas variables de la variable monstruo, y luego en el process declaras una variable del tipo monstruo que ya trae inicializadas la mayoría de sus variables si no todas, lo que no se es, si la sentencia que has puesto
es la declaración de monstruo ¿cuando lo llames haces monstruo() o monstruo(1,2,3579,159...), si lo he entendido bien no debería ser necesario.

GRACIAS A TODOS (si, a todos)

En mi ejemplo de los monstruos, no hay una sola variable de tipo monstruo, quizás te has liado porque he nombrado el proceso y el tipo igual, imaginemos que tenemos

type tipo_monstruo
int vida
int dano
string nombre
end

y

process proceso_monstruo(tipo_monstruo caracteristicas, int posicion_x, int posicion_y)

donde como argumento caracteristicas es una variable privada(como cualquier otra variable argumento)

Ahora yo puedo declarar varios tipos de monstruos
global
...
tipo_monstruo lobo;
tipo_monstruo dragon;
tipo_monstruo vibora;
...
end
begin
...
lobo.vida=20;lobo.dano=5;lobo.nombre="Lobo";
dragon.vida=100;dragon.dano=50;dragon.nombre="Dragon";
vibora.vida=50;vibora.dano=10;vibora.nombre="Víbora venenosa";
...

y entonces, si quiero poner 2 lobos y un dragón haré:

proceso_monstruo(lobo,500,250);
proceso_monstruo(lobo,275,200);
proceso_monstruo(dragon,350,400);

entonces tendremos 3 procesos proceso_monstruo cuya variable caracteristicas será en dos casos igual que la variable lobo y en otro igual que la variable dragon. Además hay que tener en cuenta que los tipos predefinidos SIEMPRE se pasan como punteros aunque no escribas "pointer", así que si dentro de proceso_monstruo varías la variable caracteristicas, no estás variando las características de ESE lobo, sino de todos los lobos o de todos los dragones. Para hacer eso tienes que crearte una nueva variable caracteristicas_2 y decir: caracteristicas_2 = caracteristicas;

Splinter dijo que el ejemplo de los monstruos no era el más adecuado. Por pura curiosidad, ¿por qué lo dices? Es que me fio bastante más de ti que de mi en cosas de programación así que por favor explícamelo a ver si tengo algún concepto mal.

Un saludo.

PD: Vaya mensajes más largos que escribo...

kim-elet-o

Jejeje es que el tema de la memoria dinamica no es moco de pavo, es todo un mundo de lo mas complejo, pero a la vez de lo mas versatil, hasta que lo proyectos que haces no alcanzan cierta complejidad, y empiezas a crear codigo versatil, dinamico y flexible, no utilizas este tipo de variables, por que llegado a este punto se te hace necesario el uso de memoria dinamica. ;) ;) ;)
|/
|\im-elet-o el yayo programador.

Danielo515

Chicos, que aunque se autodidacta también he empollado teoría eh? (no tomarse esto a mal) Cuando he preguntado por la memoria dinámica, no quería decir que no le viera la utilidad, o que no supiera las ventajas que tiene con respecto al ahorro/límites de memoria, es un concepto que tengo muy claro aunque solo lo haya usado para agendas y tal. Lo que quería decir con la utilidad es a su utilidad en juegos. Si os fijais, casi todo lo que me habeis puesto de ejemplos, son más bien aplicaciones (editor de texto, programa de dibujo, editor de mapas) pero poco para juegos, quizá splinter puso algún ejemplo, pero son ejemplos en los que intervienen archivos externos en el programa y suele ser porque se le da a la gente la posibilidad de añadir cosas. A mi por ejemplo en un matamarcianos no se me ocurre para que la puedo necesitar.
         De todos modos, todas vuestras respuestas me han sido tremendamente útiles, ahora ya se como hacer un undo en un programa de dibujo (algo que tenía en mente).
        Lo de las variables predefinidas no lo había entendido hasta ahora, y si que parecen útiles, pero eso de que se pasen por referencia, a mi entender es un pequeño malgasto de memoria no? cada monstruo tendría dos variables de este tamaño,ya que de otro modo habría que declarar tantas variables como procesos ¿por que es mejor esto que declarar una estructura privada o pública? la declaras en la declaración del proceso y cada vez que llames a uno ahí la tienes.

Gracias gente, sois geniales, siempre sacándome de mis dudas...