ADA - Error extraño en ADA

 
Vista:

Error extraño en ADA

Publicado por Juasjero (1 intervención) el 18/06/2010 10:26:44
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.

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;
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Problema al agregar barcos a la matriz

Publicado por Alejandro (155 intervenciones) el 01/07/2023 00:38:48
En el código que compartiste, parece haber un problema en la lógica de tu procedimiento `InsertarBarco`. La declaración `totalbarco := totalbarco + 1;` se coloca antes de verificar si la casilla está llena o no. Esto significa que el contador `totalbarco` se incrementará incluso si la casilla ya está ocupada, lo que puede causar problemas al agregar los barcos al tablero.

Además, en el código comentado, hay una condición `if totalbarco <= CantidadBarcos then` que parece estar deshabilitada. Si esta condición es necesaria para limitar la cantidad de barcos agregados, deberías revisar por qué está comentada y asegurarte de que se active correctamente.

Aquí hay una posible solución para corregir el problema:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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);
 
   if not(llenoInsertar) then
      totalbarco := totalbarco + 1; -- Incrementar el contador solo si la casilla no está llena
 
      if totalbarco <= CantidadBarcos then
         for i in m..o loop
            for j in n..p loop
               tableroInsertar(j, i) := totalbarco;
            end loop;
         end loop;
         Put(totalbarco);
      end if;
   end if;
end;

Es importante verificar que la lógica de tu programa en general sea correcta y que los índices y límites de la matriz se manejen adecuadamente. Además, te sugiero que revises el código en las funciones `ConvertirCaracter`, `OrdenCoord` y `CasillaLlena` para asegurarte de que estén implementadas correctamente y no estén causando el comportamiento inesperado que estás experimentando.

Recuerda que en la programación, incluso pequeños cambios como agregar un `Put` pueden afectar el flujo de ejecución y revelar problemas o comportamientos inesperados. Es importante analizar cuidadosamente la lógica de tu programa y realizar pruebas exhaustivas para identificar y solucionar cualquier problema.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar