Error con lista enlazada r263

Started by Drumpi, May 01, 2013, 07:35:44 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Drumpi

Hola a todos:

Hace tiempo que no me paso por aquí, ¿verdad? ^^U
Bueno, ando programando para el concurso de Donan, y vamos justitos de tiempo, así que necesito cuatro ojos.
Tengo el lista_items.inc que os adjunto, que maneja una lista enlazada del tipo obj_item que se guarda en la variable global lista_objetos_obtenidos (ambas definidas en el items.h).
Pues cuando lo pruebo en el juego, me salta la típica ventana de fallo grave de windows, indicando error al acceder a un puntero, concretamente al hacer la operación de la línea 23 (pasar el puntero a la posición siguiente) o al comprobar si el puntero que contiene vale null.
Obviamente, lo probé de forma aislada al juego, ejecutando la función debug_lista_items() que incluyo, y se me cuelga cuando se añade el segundo objeto (según los SAY) o a veces ni eso, se queda como en un bucle infinito.

Estoy usando la versión r263, que es la última estable que tengo (la r307 tiene ese bug con los gráficos). A ver si vosotros veis algo que haya escrito mal. Son simples funciones de añadir nodo al final de la lista, borrado de la lista y recorrido de la lista obteniendo datos, pero yo no veo fallos, aun comparando con otros códigos que sé que funcionan.
Si os falta alguna variable, omitid la función borrar_items_del_mapa(), no es relevante para el funcionamiento de la función de debug, y es casi una copia de comprobar_lista_items().

Muchas gracias, a ver si es una tontería, como siempre, y con el cansancio no veo ya tres montados en un burro :D :D :D

PD: suerte a los demás participantes ;)
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

Bueno, aunque el concurso ya haya terminado, sigo necesitando que alguien me ilumine ^^U
Ahora no podeis poner la excusa de la rivalidad para no responder :D :D :D
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)

SplinterGU

lo vere en estos dias, disculpa la falta de respuesta.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

No pasa nada, ahora mismo estoy liado con el ordenador, así que no hay tanta prisa :D
De momento lo tengo solucionado enlazando procesos congelados, que hacen las veces de nodos (sí, estilo Java).
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)

Erkosone

Vaya.. no se me hubiera ocurrido en la vida.. de verdad.. no sabes que buena idea me has dado Drumpi, muchas gracias en serio, llevo planteando unos días una historia con las listas dinámicas.. y mira tu por donde.. que mejor que un proceso como nodo para simplificar? pues nada XD.. es lo mas simple!
Gracias por la idea!!

Drumpi

Jajaja, de nada, pero de todas formas, yo valoraría mirar el usar mejor memoria dinámica antes que procesos. No he hecho un test de velocidad, pero ten en cuenta que crear un proceso conlleva reservar mucha más memoria que con una estructura de datos, es, en teoría, más lento a la hora de crear y destruir, y añade tiempo extra al gestor de procesos al tener más que mirar.
Pero es sólo en teoría, no he podido demostrarlo, quizás, al crear/destruir procesos, al ser comandos del sistema (internos a Bennu) son mucho más rápidos que los comandos del propio lenguaje Bennu.

Pero sí, para acostumbrarse a usar listas enlazadas, usar procesos es lo más simple para aprender. Si te dejas algo en memoria sin borrar, el proceso queda activo y el programa no se cierra, y si intentas eliminar un proceso que ya había sido borrado o que el contenido del puntero está mal, te dará el mensaje de que dicho proceso no existe. No hay peligro para el ordenador ;)
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)

SplinterGU

drumpi, por favor, ponme un sample compilable... ahorrame el tiempo de contruirlo, asi puedo ayudarte.

saludos.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Bueno, era crear un main típico que incluyera los ficheros, que llamase a la función y tener a mano un bgdc.import genérico que... bueno, que no tengo excusas, que aquí lo subo ready to compile and run ;)
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

¿Alguien ha visto algún error en el código? He intentado verlo de nuevo con "otra perspectiva" pero sigo sin ver nada raro.
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)

Arcontus

#9
Quote from: Drumpi on June 22, 2013, 12:36:41 PM
¿Alguien ha visto algún error en el código? He intentado verlo de nuevo con "otra perspectiva" pero sigo sin ver nada raro.
El problema está en como generas el objeto "obj_item".
function add_item_conseguido (numero, pos_x, pos_y)
private
    obj_item pointer new_ptr;
    obj_item pointer aux_ptr;
begin
    //se crea el nuevo objeto
    new_ptr=alloc(sizeof(obj_item pointer));


Tu haces un alloc de un puntero y obviamente no deseas hacer eso, lo que tu quieres es reservar un cacho de memoria para almacenar datos, por lo que tienes que reservar el espacio de memoria para guardar los datos. Tan simple como cambiar "new_ptr=alloc(sizeof(obj_item pointer));" por "new_ptr=alloc(sizeof(obj_item));"
No he continuado analizando el código ya que con ese cambio a mi se me ejecuta correctamente.

Un saludo!
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

Drumpi

please, kill me ^^U

Efectivamente es un error gordo, y bastante obvio cuando no estás enfrascado en el código. Le echaré un vistazo en el código, porque ya con eso debería ir de miedo.

Muchas gracias, Arcontus. Karma++
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)