Foro de elhacker.net

Programación => Programación General => Mensaje iniciado por: Shurhand en 18 Junio 2010, 10:33 am



Título: [ADA] Error inexplicable en inserción de datos
Publicado por: Shurhand en 18 Junio 2010, 10:33 am
Hola amigos:

Antes de enseñároslo os lo cuento: Mi tablero es un array de enteros. Esos enteros representan barcos. Son barcos del juego "hundir la flota" leidos desde un fichero como un par de cordenadas A1B2.

Bien, pues me percaté de que los barcos no se estaban agregando bien al array. Así que decidí poner un Put para ver lo que salía y poder localizar el error.

Primero lo hice con el procedimiento que muestra por pantalla el array. Nada. Después seguí con las lecturas de datos y por último, por el procedimiento que agrega a los barcos a los barcos a la matriz. Solamente en este último caso ocurrió algo sorprendente:

Cree un Put que me dijese por qée barco iba cada vez que lo agregaba. Lo podeis ver en azul comentado en esta imagen: img337.imageshack.us/img337/1858/errord.png

También podeis apreciar la en esa imagen: a partir del barco 16 no se agrega ninguno mas.

Pues ahora mirad lo que pasa por agregar un Put en ese mismo procedimiento: img191.imageshack.us/img191/6537/error2j.png

¿Veis la salida? Ahora ya muestra 21 barcos. Bueno, casi 21 porque si os fijais bien, no aparece por ningún lado el número 17.

¿Cómo es posible que un proceso iterativo se salte un número 17?
¿Cómo es posible que un programa cambie de comportamiento con tan solamente agregar un Put? Un Put escribe en el buffer standar de salida, así que... ¿Qué tiene que ver ese Put con una salida completamente distinta, es decir, la introducción de datos en la Matriz?

Os copio el procedimiento por si alguno me puede ayudar.

ConvertirCaracter recibe chars y devuelve integers: así opero mejor por la matriz y sus posiciones.
Casi llena comprueba que la matriz no esté llena para las coordenadas que reciba. De este modo, un barco no puede "pisar" cualquier casilla de otro.
totalbarco es un acumulador, para pintar barcos en el tablero.
CantidadBarcos es una constante integer de valor 21. Es el máximo número de barcos permitidos.

Código:
	procedure InsertarBarco(tableroInsertar: in out TipoTablero; a, b, c, d: in out Character; totalbarco: in out Integer) is
m, n, o, p: Integer;
llenoInsertar: Boolean;
begin
m := ConvertirCaracter(a);
n := ConvertirCaracter(b);
o := ConvertirCaracter(c);
p := ConvertirCaracter(d);

OrdenCoord(m, n, o, p);
CasillaLlena(tableroInsertar, m, n, o, p, llenoInsertar);
totalbarco := totalbarco + 1;
if not(llenoInsertar) then
for i in m..o loop
for j in n..p loop
-- if totalbarco <= CantidadBarcos then
-- tableroInsertar(j,i):=totalbarco;
Put(totalbarco);
-- end if;
end loop;
end loop;
end if;
end;