Buenas tardes:
Acá de nuevo yo con mis dudas (existenciales jeje).
Tengo una lista doblemente enlazada la cual inicializo así:
Cab y Fin, son los punteros Cabecera y Final que están declarados como una variable tipo PunteroLista y éste tipo tiene esta estructura:
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:
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?