ADA - procedimiento next

 
Vista:
sin imagen de perfil

procedimiento next

Publicado por miguel (1 intervención) el 17/01/2017 17:58:25
Hola, estoy intentando hacer un procedimiento next que me imprima el siguiente elemento en una tabla hash con resoluciones de colision mediante encadenamiento, y en mi código me da un access check failed en el primer exit y no sé por qué.

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
type Cursor is record
		M : Map;
		Element_A : Cell_A;
		Position : Integer; --recorre posición array
	end record;
 
procedure Next (C: in out Cursor) is
		-- trabajar con c.position en vez de pos
	begin
		loop
			if C.M.Tabla(C.Position) /= null then
				loop
					if C.M.Tabla(C.Position).Next /= null then
						C.Element_A := C.Element_A;
					else
						C.Position := C.Position + 1;
					end if;
		--116	exit when C.M.Tabla(C.Position).Next = null;
				end loop;
			else
				C.Position := C.Position + 1;
			end if;
		exit when C.Position = Max_Activos or C.M.Tabla(C.Position).Next /= null;
		end loop;
	end Next;
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

Solución para acceso denegado en procedimiento Next de tabla hash

Publicado por Alejandro (155 intervenciones) el 03/07/2023 18:27:23
El error "access check failed" que estás experimentando en el primer `exit` se debe a que estás intentando acceder a la propiedad `Next` de `C.M.Tabla(C.Position)` después de verificar que es igual a `null`. Sin embargo, debido a la lógica del código, cuando `C.M.Tabla(C.Position)` es `null`, se salta el primer `loop` y se llega al `exit` sin haber inicializado `C.Element_A` y `C.Position`. Esto causa el error de acceso.

Para solucionar el problema, debes mover el segundo `loop` después de la línea `C.Position := C.Position + 1` y antes de la comprobación del segundo `exit`. Además, debes asignar `C.M.Tabla(C.Position)` a `C.Element_A` dentro del segundo `loop`. Aquí tienes el código corregido:

1
2
3
4
5
6
7
8
9
10
11
procedure Next (C: in out Cursor) is
begin
   loop
      C.Position := C.Position + 1;
      exit when C.Position = Max_Activos or else C.M.Tabla(C.Position) /= null;
   end loop;
 
   if C.Position <= Max_Activos then
      C.Element_A := C.M.Tabla(C.Position);
   end if;
end Next;

En esta versión corregida, incrementamos `C.Position` antes de verificar si alcanzamos el límite máximo o si el elemento en esa posición de la tabla no es `null`. Luego, después del `loop`, asignamos `C.M.Tabla(C.Position)` a `C.Element_A` solo si `C.Position` está dentro de los límites permitidos.

Espero que esta corrección resuelva el problema de acceso que estabas experimentando.
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