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

[0] Índice de Mensajes

Ir a la versión completa