SoloCodigo

Programación General => Pascal => Mensaje iniciado por: thot_ohm en Jueves 5 de Enero de 2006, 20:19

Título: Valor De Un Puntero
Publicado por: thot_ohm en Jueves 5 de Enero de 2006, 20:19
Buenas tardes:

Acá de nuevo yo con mis dudas (existenciales jeje).

Tengo una lista doblemente enlazada la cual inicializo así:

Código: Text
  1.  
  2.   Cab := nil;
  3.   Fin := nil;
  4.  
  5.  

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
  1.  
  2.   PunteroLista = ^NodoLista;
  3.   NodoLista = record
  4.     Datos : TipoDatos;
  5.     Sig : PunteroLista;
  6.     Ant : PunteroLista;
  7.   end;
  8.  
  9.  

En un momento del código, necesito consultar un dato, cuyo procedimiento es este:

Código: Text
  1.  
  2. procedure ConsultarDato(Info : TipoDatos; var Encontrado : boolean; var Act, Ant : PunteroLista);
  3.  
  4. begin
  5.   Ant := Cab;
  6.   Act := Ant^.sig;
  7.  
  8.   while not (Act^.Datos.Nombre = Info.Nombre) and (Act <> nil) do
  9.   begin
  10.     Ant := Act;
  11.     Act := Act^.sig;
  12.   end;
  13.  
  14.   if (Act^.Datos.Nombre = Info.Nombre) then
  15.     Encontrado := true
  16.   else
  17.     Encontrado := false;
  18. end;
  19.  
  20.  

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?
Título: Re: Valor De Un Puntero
Publicado por: Enko en Sábado 7 de Enero de 2006, 18:02
La verdad que mucho no entend'i pero prob'a hacer>

Código: Text
  1.  
  2. procedure ConsultarDato(Info : TipoDatos; var Encontrado : boolean; var Act, Ant : PunteroLista);
  3.  
  4. begin
  5.    Encontrado := False;
  6.    Ant := Cab;
  7.    Act := Ant^.sig;
  8.  
  9.    while Act^.Datos.Nombre = Info.Nombre do
  10.    begin
  11.        Ant := Act;
  12.        Act := Act^.sig;
  13.        if (Act^.Datos.Nombre = Info.Nombre) then
  14.        begin
  15.             Encontrado := true;
  16.             Break;
  17.         end;
  18.      end;
  19. end;
  20.  
  21.