crear una lista de objetos

Started by hokuto40, March 06, 2023, 07:36:32 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

hokuto40

He mirado en el foro pero no he encontrado nada que me explique correctamente a crear una lista de estructuras dinamica.Esto es algo que he ido dejando pero haber si me lo podeis explicar porque por mas que miro ejemplos no comprendo.

Quiero crear objetos que serian estructuras y luego crear una lista de estructuras para ir guardando esos objetos cuando lo vaya requiriendo,para luego recorrer esa lista y mostrarlos,la lista dinamica tendria que tener una funcion para añadir objetos,otra para borrar los objetos de uno en uno y una ultima para borrarlos todos.

Seria como crear una clase en c++ y ir guardando esas clases en un std::list,añadir con push y eliminar con pop etc..

Drumpi

Tendría que repasarlo, así que te lo digo de memoria ¿ok?
Para crear una lista dinámica, si no te quieres liar con nodos, puedes usar Alloc para crear un array dinámico, que puedes modificar usando realloc. Para ello, yo usaba type para crear un nuevo tipo de variable, y con sizeof podía "allocar" tantos nodos como necesitase.

Si necesitas crear las típicas listas de nodos, de nuevo recurres a type para crearte tu nodo (con type podías añadir enteros, floats, bytes y demás dentro de la estructura, pero cuidado con string, que aunque funcionan bien, y no he vuelto a conseguir romperlo desde la r333, aún puede quedar algún puntero díscolo por ahí), y añades un ptr mytype como PUNTERO al siguiente nodo.
A partir de ahí es lo de siempre: añadir un nodo es crear un "ptr mytype temp_ptr", hacerle un alloc de mytype, asignarle valores, y hacer que el "ptr mytype" del nodo que iba a ser el anterior, apunte a ese nuevo nodo.

No recuerdo si llegué a subir un tutorial sobre memoria dinámica al foro. Me suena haberlo escrito y subirlo, pero no puedo ponerme a buscarlo.
Si no, creo que subí unos ficheros para crear listas dinámicas de textos, o listas dinámicas para leer ficheros del disco. Algo de eso subí, y te puede servir de ejemplo. No deberían ser demasiado complejos de leer, pero se recomiendan conocimientos básicos de listas enlazadas en cualquier otro lenguaje (léase C, C++).
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Drumpi

EDIT: mira, aquí pregunto sobre el tema. Comprueba si en el último zip hay código que, aunque esté mal, te de una idea de cómo funciona el tema de las listas enlazadas. Mira que en su día las usé a cascoporro, pero hace demasiado tiempo que no toco código BennuGD ^^U
http://forum.bennugd.org/index.php/topic,3553.msg60917.html#msg60917
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

hokuto40

Gracias Drumpi,lo mirare haber si lo entiendo.Por cierto,estan todos los foros de los distintos divgame muertos practicamente.

Drumpi

Bueno, la mayoría de la gente de este foro es de habla inglesa, o se ha movido a Discord.
Yo siempre he estado en contra de la inmediatez de Discord, así como cosas como Facebook, Tiktok y diversos chats, porque la información que se vuelca en un foro siempre es más fácil de consultar días después que en un chat. Y dado que había dejado de haber movimiento aquí, pues me paso más por GP32spain, que me gusta menos, aunque tiene un carácter más general.

Pero bueno, menos batallitas de abuelo Cebolleta y más responder :D
Aprovecho que, por una vez, estoy delante del código y te paso dos ejemplos de listas enlazadas, con punteros. Sí, dan miedo, al principio, y un montón de problemas si no los manejas bien, pero bueno, creo que tienes funciones para todo en los ejemplos que te paso. No están documentados, pero creo que si vas a las funciones más básicas y usas papel y lápiz, lo entenderás en un par de horas.
El código se divide en dos partes: el .h es donde se declaran las variables y los tipos que se van a usar en el .inc, y el .inc no es más que un trozo de código que se puede "incrustar" en el prg principal usando "include filelist.inc" (el .h también hay que incluirlo, claro).
El filelist es el código que uso en mi Tilemap Editor v2 para listar los ficheros de las carpetas, para abrirlos o guardarlos. El class_string es el que uso para almacenar las distintas cadenas de texto que usa el programa, pero en otros juegos me sirve para guardar conversaciones, listas de nombres o, en general, cualquier lista de strings que necesite.
La idea es que cambies el "type" que usan por el que necesites, sustituyendo la string por ints, bytes, o por una amalgama de distintas variables, según necesites.

A partir de ahí, sólo es cuestión de llamar a las funciones y... bueno, debería tener algún fichero de testeo que los usase para hacer pruebas, pero no encuentro dichos ficheros, por eso, te he incluido el lang_files.zip, que lo que hace es que, al pasarle la ruta de un fichero que contiene strings guardadas, las lee y genera una lista de strings que puedes tener en memoria y usarla cuando quieras.

EDIT: mira, acabo de encontrar una función que testea la class_string.inc, que seguro que te ayuda a entender cómo usarla. Te la añado aparte.

Espero que te guíe.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

hokuto40

Muchas gracias Drumpi,esto me sera de mucha ayuda para mis experimentos.

Drumpi

Ok, si tienes alguna duda, no dudes en usar chatGPT :D

Nah, es broma, me preguntas y yo te lo explico. Si sabes cómo funcionan las listas enlazadas, esto lo entenderás enseguida, y sólo te faltará entender la sintaxis de BennuGD, pero Splinter hizo un buen trabajo en que fuera fácil de entender y de manejar.

Si no, ya digo, definiendo un type, y usando alloc( x * sizeof myType) y realloc puedes crear listas dinámicas y manejarlas como arrays, pero cuanto más grande sea la lista, creo que más penaliza el realloc. Y no te olvides del free cuando dejes de usarlas.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)