Programación General > Pascal
Valor De Un Puntero
(1/1)
thot_ohm:
Buenas tardes:
Acá de nuevo yo con mis dudas (existenciales jeje).
Tengo una lista doblemente enlazada la cual inicializo así:
--- Código: Text --- Cab := nil; Fin := nil;
Cab y Fin, son los punteros Cabecera y Final que están declarados como una variable tipo PunteroLista y éste tipo tiene esta estructura:
--- Código: Text --- PunteroLista = ^NodoLista; NodoLista = record Datos : TipoDatos; Sig : PunteroLista; Ant : PunteroLista; end;
En un momento del código, necesito consultar un dato, cuyo procedimiento es este:
--- Código: Text --- procedure ConsultarDato(Info : TipoDatos; var Encontrado : boolean; var Act, Ant : PunteroLista); begin Ant := Cab; Act := Ant^.sig; while not (Act^.Datos.Nombre = Info.Nombre) and (Act <> nil) do begin Ant := Act; Act := Act^.sig; end; if (Act^.Datos.Nombre = Info.Nombre) then Encontrado := true else Encontrado := false;end;
TipoDatos es un tipo con diferentes campos.
Ok. Fíjense en las dos primeras líneas de éste procedimiento. Ant := Cab copia la información de Cab en la variable Ant, por lo que en la primera pasada Ant debe ser Nil y apuntar a Nil (¿no?). Le puse un watch a esta variable (Ant) y efectivamente, en la primera pasada toma el valor Nil.
En la segunda línea, Act pasa a ser el valor apuntado por Ant^.sig, que, como Ant apunta a Nil, Act debería valer Nil (¿no?), por lo que, en la primera pasada, el while que viene no se ejecutaría.
Pues no. Le puse un watch a la variable Act y ésta no toma el valor Nil y el while se ejecuta dos veces antes de que Act tome el valor Nil. En la primera pasada del while (desde Act := Ant^.sig), Act toma el valor PTR($FF02,$E07), en la segunda pasada toma el valor PTR($6030,$18FC), terminando la segunda pasada (en la instrucción Act := Act^.sig), toma el valor Nil.
¿Qué estoy haciendo mal?
Enko:
La verdad que mucho no entend'i pero prob'a hacer>
--- Código: Text --- procedure ConsultarDato(Info : TipoDatos; var Encontrado : boolean; var Act, Ant : PunteroLista); begin Encontrado := False; Ant := Cab; Act := Ant^.sig; while Act^.Datos.Nombre = Info.Nombre do begin Ant := Act; Act := Act^.sig; if (Act^.Datos.Nombre = Info.Nombre) then begin Encontrado := true; Break; end; end;end;
Navegación
Ir a la versión completa