De vuelta a Fenix

Started by Drumpi, November 30, 2013, 06:48:37 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Drumpi

Hola a todos:

Como sabeis, hay un concurso en GP32spain (y si no, pues ahora sí) en el que hay que programar minijuegos para la GP32 antes de fin de año.
Por eso, me he downgradeado temporalmente y estoy liado con Fenix. Qué recuerdos... y qué de problemas; no sé qué versión era (¿083?) pero cada tres pasos que doy me encuentro un bug (¿cómo puede ser que RETURN no devuelva ningún valor?). Así que intento usar las cosas más simples, pero mi memoria no es lo que era.

El caso es que necesito implementar una lista de strings, para guardar los textos del juego que almaceno en ficheros TXT, así que estoy tirando de punteros. En concreto, de mi código de Bennu para estos menesteres.
El problema que tengo es que los pointers no pueden valer NULL, porque NULL se implementó en Bennu hacia la r80 y algo. He intentado usar

if (mi_puntero != 0)

pero Fenix me ha soltado que no es una operación permitida para ese tipo de dato. ¿Alguien se acuerda cómo se podía saber si un puntero había sido inicializado?

Más adelante lanzaré más dudas, si surgen.
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

te va a sonar a chorrada pero puedes inicializarlos con "null" XD.. si, un literal, y luego compruebas si ya no vale "null".

Drumpi

Pues no, haciendo

if (mi_puntero == "null")

me sigue diciendo "data types not compatible with operation ("null")". :(
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)

JaViS

null no esta implementado en fenix.
Working on Anarkade. A couch multiplayer 2D shooter.

laghengar

Prueba poniendo

if (!mi_puntero)

Revolando por el foro de fenix encontré esto.

http://forum.divsite.net/viewthread.php?tid=5965&page=1#pid59055
!!!Blender Blender Blender yuhuuuuuuu¡¡¡ novato o_O

Drumpi

No quería tener que ponerme a buscar por el foro de Fenix, llevo ya dos días a "full throttle" porque supuestamente hoy debía haber terminado el dichoso editor y aun no he conseguido que funcione ni la interfaz.

Por lo que veo, es como dices, Laghengar: Fenix permite asignar el valor cero, pero no comparar con ningún tipo de valor (al menos en la que estoy usando, la 084, aunque creía estar usando la 083... pero eso es irrelevante en este caso), lo cual me deja perplejo.
El ejemplo que pones parece un workaround bastante sensato, pues si un puntero vale 0 equivale a false, pero el problema es que en esta versión de Fenix, cualquier número par se considera FALSE, por lo que si almacena una dirección de memoria par, puede interpretar que está sin inicializar ¿Se podría dar el caso?
No, tampoco me deja comparar >0 ni !=0, ya lo he intentado.

He intentado crear un puntero llamado NULL, y tampoco me deja hacer la comparación.

¿Alguna otra sugerencia? porque estoy falto de ideas, lo único que se me ocurre es evitar este tipo de comprobaciones y controlar muchísimo que no se pasen punteros sin inicializar (algo casi imposible, porque si la lista está vacía, el pntero debería señalar a NULL).
Es que lo otro que me queda es crear suficientes variables String para almacenar cada una de las líneas del fichero de texto, porque tanto el array de strings como el array de structs que contienen strings, si no recuerdo mal, daban muchísimos problemas, eran muy inestables.
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

¿Ninguna idea? Tendré que hacerlo por "fuerza bruta" :S
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)

laghengar

Que va ni idea, alguna vez hice algo con punteros, pero todas esos códigos fuentes los perdí y fue hace mucho. Para tratar de recordar me fuí al foro de Fenix y lo único que vi fue eso que te dejé  :( . Lo siento.
!!!Blender Blender Blender yuhuuuuuuu¡¡¡ novato o_O

Drumpi

Bueno, se me ha ocurrido crear un nuevo tipo de dato, que contenga un puntero a un nodo String, con una variable llamada null.

type string_node
string texto;
int null;
end

type lista_textos
string_node *lista;
int null
end

De esta forma, puedo pasar una variable tipo lista, aunque esté vacía, y tener null para decirme si lo está o no, y ya tener los distintos nodos con sus textos. El problema es pasar un puntero vacío a las diversas funciones, y no puedo pasar directamente un string_node porque eso ya es un nodo, y aun estando vacío, tiene un valor: ""

El problema que estoy teniendo es que Fenix es muy raro en su sintaxis con punteros, la mitad de las veces no me coje *variable para almacenar/leer el dato y tengo que escribirlo (*variable).
Si tuviese la función

function leer_lista (lista_textos pointer lista)

¿Cómo haría para leer un dato? (*lista).null o (*lista.null) Al haber programado en C++, esa parte nos la saltamos.
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

Parece que Fenix toma por bueno puntero.null para acceder.
Lo que no lleva tan bien es el tema de las Strings  >:(

Llevo todo el puñetero día con un segmentation fault recurrente. Al principio era problema mío, por no acordarme de inicializar las estructuras, pero una vez corregido, empezó a funcionar, hasta que dejó de hacerlo. ¿Os acordais del "código mágico" que se escribía en los primeros días de programación? esos que funcionan hasta que llega el profesor y fallan. He revisado, línea por línea, a base de SAY para ver dónde petaba, y sucedía en la asignación de una cadena al campo string.
Cambié la declaración de la String y la puse como último elemento del string_node, y todo volvió a funcionar. Lo metí en el programa... y volvía a fallar. Reduje el tamaño de los textos, a ver si era por eso, y fue hasta que le hice la tercera prueba.

Aquí es cuando se ponen a prueba los conocimientos de programación a bajo nivel y la intuición de cómo puede estar hecho el código. Supuse que el problema era de la naturaleza cambiante en el espacio de los strings, que se agrandan y reducen por petición, y que esto pisaba el espacio de memoria de otros elementos. Se supone que los strings son una especie de punteros, que deberían estar en un espacio reservado para ese tipo, pero... Total, que tiré por la calle de enmedio: cambié la string por un array de char de 20 posiciones y todo va bien. Por suerte no he tenido que modificar código, porque son más de 600 líneas de la class_string, que ya había reescrito ayer. Pero me cabrea el tener que recurrir a un array predefinido, aunque esté en un nodo de lista enlazada, porque estoy trabajando para GP32, y el espacio de memoria es crítico.
Menos mal que este editor es muy simple, que no es el editor que hice hace tiempo de múltiples mapas de tamaño infinito en las 3 coordenadas, con 20 herramientas y su propia gestión de ventanas.
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

no debes usar punteros a strings...

si quieres hacer punteros a un pseudo string, debes hacer punteros a char y meter ahi una string.

ya se hablo infinidad de veces como funcionan las strings en fenix/bennugd... no puedes asignar null a ellas... en todo caso string nula (""), pero nunca null.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

No asigno null a una string, sino al puntero a string, que no es lo mismo :)
De todas formas, no suelo usar punteros a string, salvo para pasar parámetros ¿por referencia? nunca me acuerdo del nombre. vamos, lo típico:

function linea (string pointer mi_texto...

Aquí lo que me falla es un puntero a un tipo nuevo llamado string_node que contiene una string. Como digo, de momento uso char[20], pero no me gusta la idea de usar char[500] para textos largos, es mucha memoria "desperdiciada" para una consola tan limitada como GP32. También es verdad que aun no he llegado a usar ni 2MB de RAM, pero he tenido malas experiencias en GP2X y FPGs de 5MB y quiero evitarlo a toda costa (era un FPG con un "video").
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

#12
no debes usar punteros a string... y NULL hace referencia a un puntero (direccion NULL), o sea, es lo mismo.

puedes usar char * y allocarlo segun necesites.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

igual estoy pensando seriamente en cambiar esto para la proxima version, cuando digo "esto", me refiero al comportamiento y manejo de strings... pero no se, tengo que pensarlo bien y ver que la idea borrador que tengo en la cabeza no de ningun problema...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Splinter, creo que no tienes en cuenta de que hablo de Fenix 084: NULL no existe en esta versión.
Y en teoría, sí se podían usar punteros a string, pues aunque son un tipo muy especial de datos, por entonces, su uso era igual que cualquier otro tipo, a la hora del paso de parámetros al menos.
De todas formas, intento no usar strings con variables contiguas en memoria (arrays, structs arrays, mi_tipo array...), pero no tengo más remedio que usar punteros a strings en algunos casos para evitar los errores de esta versión de Fenix. Usar char * puede complicar demasiado la lógica del programa y hay funciones que no admiten este tipo de datos.

A ver, que yo no hubiera tenido ninguna pega usando otra versión de Fenix, como la 083b, la 084CVS o la 089, o mejor aun, Bennu. Pero para GP32 sólo existe la versión más inestable de Fenix, y estoy lidiando no sólo con errores propios y errores de concepto. Y me estoy retrasando demasiado. :S
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)