Crash con los punteros

Started by Drumpi, December 24, 2015, 06:56:17 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Drumpi

Hola a todos ¡FELICES FIESTAS!

Hace mucho que no me paso por aquí, pero he estado terminando un Máster de Videojuegos que me ha consumido todo el tiempo libre disponible (más adelante os subiré un video del juego/nivel que hemos desarrollado para que lo veais).
El caso es que tras tanto Unity, tanto C# y tanto MonoDevelop, me han entrado ganas de volver a programar "de verdad", es decir: BennuGD en Notepad++ :D :D :D
Estoy convirtiendo un programa que empecé para un concurso de GP32, obviamente con Fenix (en concreto con aquella 0.84 que todos odiamos), y estoy deshaciendo todos los walkarounds que metí.

Uno de ellos es con una función que toma un "string_node pointer" (un tipo propio que contiene una string y un puntero al siguiente nodo) y un int y devuelve una string. En su interior llama a una función con los mismos parámetros de entrada y salida. El caso es que ha empezado a darme fallos del tipo "sale una ventana en windows de error grave y me cierra la aplicación". Ya solucioné algo similar ayer, por culpa de un tipo de dato erroneo, pero esto es distinto y necesito una pista para no volverme loco (ya conoceis las magnitudes de código que suelo manejar).
Bennu me arroja el siguiente mensaje por la consola:

Program: d:\BennuGD\binarios\r307\bin\bgdi.exe
File: strings.c, Line 525

Expression: str2

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.


A ver si alguien me puede comentar qué puede ser para ver qué operación estoy haciendo mal, pero seguro que tiene algo que ver con punteros :D Es que en cuanto le añado un "SAY" para leer los datos que le paso a la función, todo funciona correctamente.

Un saludo a todos, y que no se os atraganten los polvorones :D (excepto a Splinter, que hay que mandarle una caja para que los pruebe)
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

Vale, al final anteayer se me iluminó la bombilla, probé y funcionó (de momento).
El problema era que el tipo lo había declarado así:
type string_node
    string sn_string;
    string_node pointer sn_sig;
end


Al cambiar el orden de sus variables desapareció el error. Olvidé que las strings son arrays variables y causan problemas si se declara algo a continuación. Al invertir la posición, el puntero sn_sig permanece siempre en la misma posición de memoria y la cadena puede volver a tener su longitud variable.

Lo dejo de recordatorio.
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

hola drumpi, tenes que evitar el uso de strings en punteros de cualquier tipo, esto que hiciste te va a fallar en algun momento.

lo que podes hacer es cambiar los strings por char[N] donde N es el tamaño maximo de las strings, eso bennu lo vera como strings.

queria ponerte un ejemplo usando char * y alloc, que si mal no recuerdo deberia funcionar, pero intentando hacer un ejemplo no logre que me imprima una string, me imprime un puntero, asi que deberia revisarlo... como te puse arriba deberia funcionar.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Entiendo que la asignación de espacio para las strings es "inteligente", porque si no, también fallaría al reservar espacio para strings tipo private. Quiero pensar que al poner la string al final del tipo, al crear un nuevo nodo con alloc/realloc, este no tomará el espacio "reservado" para la string del nodo anterior (de hecho, creo haber visto, no me hagas mucho caso, que la diferencia entre un nodo y otro era de unos 100h bytes.
Nunca me ha gustado usar char[], me recuerda que estoy desperdiciando memoria ^^U. Aunque sí que he visto que bennu me lanza un warning cuando hago:
mi_string = mi_string + char(mi_byte);
O algo similar.
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

tengo que recordar por que se hacen las strings asi... si hay alguna ventaja o no, con respecto a strings tipo C, ahora mismo no me acuerdo... sino vendria bien un cambio al respecto.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2