Segata Sanshiro
22/09/2009, 23:41
He estado notando un comportamiento un poco raro en un juego que estoy programando y no consigo encontrar el punto en el que falla. Ya por adelantado, disculpas si esto se ha tratado antes (sobre todo en el foro de Bennu) :D
Por un lado, ¿salta un error al acceder a datos de un struct que no existen? Por ejemplo, si tengo:
struct mapa[3][10][3];
int num1;
int num2;
end
e intento acceder a mapa[10][2][10].num1, efectivamente el compilador detecta un error "Index out of range". Sin embargo, si creamos una variable int i = 10, el compilador no puede detectar que habrá un error, y ya en tiempo de ejecución, si accedo a mapa[2][i].num1, [I]el intérprete tampoco da error, que me parece lo grave. En mi caso, ese acceso en teoría no válido solía devolver el mismo número casi siempre (82405 o algo así). ¿Es un bug? ¿Era conocido ya?
Y lo que me está volviendo loco :D Tengo otro struct:
struct lista[9];
int var1, var2;
end = 0,0,
14, 2,
13, 8,
// ...
2,14; // Valores de ejemplo
En ejecución, compruebo que no me he equivocado al meter los valores después del "end = ...". Los valores de ese struct deberían ser constantes. En ningún momento hago nada como lista[i].var1 = algo, ni lista[i].var1++, ni nada que intente cambiar los valores de lista y sus variables. Sin embargo, en cierto punto durante la ejecución (que no consigo aislar), algunos valores se ponen a cero. En concreto, sería por ejemplo que lista[1].var2 pasa de repente de valer 2 a valer 0 y que lista[3].var2 pasa a valer 0 también.
Si añado una tercera variable dentro del struct (var3 por ejemplo) y cambio la asignación de valores después del end a algo así:
struct lista[9];
int var1, var2, var3;
end = 0,0,0,
14, 2,0,
13, 8,0,
// ...
2,14,0; // Valores de ejemplo
sigue ocurriendo lo mismo, pero ahora son otros los valores que se ponen a cero, por ejemplo lista[1].var2 y lista[2].var2 (en vez de lista[3].var2). No sé dónde puede estar el problema. Sé que el problema deja de ocurrir si elimino cierta llamada a un proceso, pero no comprendo por qué. Esa llamada pasa varios parámetros al nuevo proceso, que lee de otra estructura (llamémosla lista2), y éste nuevo proceso nunca accede para nada a "lista" y sus variables. Y sin embargo, eliminando la llamada, deja de ocurrir el problema de "valores que cambian sin razón aparente". ¿Alguna idea de por dónde seguir buscando?
Muchas gracias a todos los que hayan llegado hasta aquí, si es que hay alguien, y a splinter por su magnífico port de Bennu :D
Por un lado, ¿salta un error al acceder a datos de un struct que no existen? Por ejemplo, si tengo:
struct mapa[3][10][3];
int num1;
int num2;
end
e intento acceder a mapa[10][2][10].num1, efectivamente el compilador detecta un error "Index out of range". Sin embargo, si creamos una variable int i = 10, el compilador no puede detectar que habrá un error, y ya en tiempo de ejecución, si accedo a mapa[2][i].num1, [I]el intérprete tampoco da error, que me parece lo grave. En mi caso, ese acceso en teoría no válido solía devolver el mismo número casi siempre (82405 o algo así). ¿Es un bug? ¿Era conocido ya?
Y lo que me está volviendo loco :D Tengo otro struct:
struct lista[9];
int var1, var2;
end = 0,0,
14, 2,
13, 8,
// ...
2,14; // Valores de ejemplo
En ejecución, compruebo que no me he equivocado al meter los valores después del "end = ...". Los valores de ese struct deberían ser constantes. En ningún momento hago nada como lista[i].var1 = algo, ni lista[i].var1++, ni nada que intente cambiar los valores de lista y sus variables. Sin embargo, en cierto punto durante la ejecución (que no consigo aislar), algunos valores se ponen a cero. En concreto, sería por ejemplo que lista[1].var2 pasa de repente de valer 2 a valer 0 y que lista[3].var2 pasa a valer 0 también.
Si añado una tercera variable dentro del struct (var3 por ejemplo) y cambio la asignación de valores después del end a algo así:
struct lista[9];
int var1, var2, var3;
end = 0,0,0,
14, 2,0,
13, 8,0,
// ...
2,14,0; // Valores de ejemplo
sigue ocurriendo lo mismo, pero ahora son otros los valores que se ponen a cero, por ejemplo lista[1].var2 y lista[2].var2 (en vez de lista[3].var2). No sé dónde puede estar el problema. Sé que el problema deja de ocurrir si elimino cierta llamada a un proceso, pero no comprendo por qué. Esa llamada pasa varios parámetros al nuevo proceso, que lee de otra estructura (llamémosla lista2), y éste nuevo proceso nunca accede para nada a "lista" y sus variables. Y sin embargo, eliminando la llamada, deja de ocurrir el problema de "valores que cambian sin razón aparente". ¿Alguna idea de por dónde seguir buscando?
Muchas gracias a todos los que hayan llegado hasta aquí, si es que hay alguien, y a splinter por su magnífico port de Bennu :D