Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Lineas que no se ejecutan (https://www.clubdelphi.com/foros/showthread.php?t=33008)

Bauhaus1975 23-06-2006 18:10:14

Lineas que no se ejecutan
 
Hola a todos!

Se me ha presentado un problema muy raro, la verdad. Trabajando con Delphi 6.
Estoy haciendo un procedimiento para insertar de manera ordenada elementos en una lista, trabajando con punteros. El problema es que hay algunas líneas ¡¡que no se ejecutan!!, incluso puede verse al ejecutar con el debug 'paso a paso'. En concreto son líneas que hacen referencia a la segunda variable de tipo puntero que hay definida en el procedimiento.

Estos son los tipos que se manejan
Código Delphi [-]
type
TC = ^itemC;
itemC = record
          Valor    : integer;
          Sgte     : TC;
end;

Y este es el mencionado procedimiento:
Código Delphi [-]
procedure TForm1.insertarOrdenado(Vector:TC;var Lista:TC);
// Insertamos el item Vector en la Lista de manera ordenada
// La ordenación es descendente (mayor valor al principio)
var
        Aux : TC;  // Puntero de avance principal
        AuxAnt : TC; // Puntero de avance secundario (un elemento por detrás de 'Aux)
        Pivote : integer;
begin
 Pivote := Vector.Valor;
        // Si la lista está vacía inserta el item directamente
 if (Lista = nil) then
                begin
  Lista := Vector;
        end
 else
         begin
                New(Aux);
                New(AuxAnt);
         Aux := Lista;
                AuxAnt := nil; // Esta linea no se ejecuta
                // Recorremos la lista de punteros hasta encontrar el sitio
         while ((Aux <> nil) and (Pivote < Aux.Valor)) do
                        begin
                        AuxAnt := Aux; // Esta linea no se ejecuta
          Aux := Aux.Sgte;
         end;
         // Aquí se inserta el elemento
                Vector.Sgte := Aux;
                AuxAnt := Vector; // Esta linea no se ejecuta
        end;
end;

¿Se puede manejar más de un tipo puntero en un procedimiento?
Supongo que sí, pero como esto es tan raro....

Bueno, a ver si alguien puede echarme un cable.
Muchas gracias y un saludo.

seoane 23-06-2006 18:28:48

Si te fijas en tu codigo en las lineas que no se ejecutan estas asignando un valor a una variable que luego no utilizas, asi que el compilador, que es muy listo, las ignora. Ahora bien fijate en el siguiete codigo y veras como ahora si se ejecuta.

Código Delphi [-]
procedure TForm1.insertarOrdenado(Vector:TC;var Lista:TC);
// Insertamos el item Vector en la Lista de manera ordenada
// La ordenación es descendente (mayor valor al principio)
var
        Aux : TC;  // Puntero de avance principal
        AuxAnt : TC; // Puntero de avance secundario (un elemento por detrás de 'Aux)
        Pivote : integer;
begin
 Pivote := Vector.Valor;
        // Si la lista está vacía inserta el item directamente
 if (Lista = nil) then
                begin
  Lista := Vector;
        end
 else
         begin
                New(Aux);
                New(AuxAnt);
         Aux := Lista;
                AuxAnt := nil; // Ahora si que se ejecuta esta linea
               //******************************

                if AuxAnt=nil then
                  ShowMessage('Si que me ejecuto, pero ejecutarse para nada es tonteria');


                //*******************************
                // Recorremos la lista de punteros hasta encontrar el sitio
         while ((Aux <> nil) and (Pivote < Aux.Valor)) do
                        begin
                        AuxAnt := Aux; // Esta linea no se ejecuta
          Aux := Aux.Sgte;
         end;
         // Aquí se inserta el elemento
                Vector.Sgte := Aux;
                AuxAnt := Vector; // Esta linea no se ejecuta
        end;
end;

Ahora como usamos el valor asignado ya no ignora la sentecia que asigna el valor.

Bauhaus1975 23-06-2006 19:14:56

Hola y muchísimas gracias por tu respuesta.
En efecto tenía que ver con la optimización del compilador de Delphi. Motivado porque había un error (de funcionamiento) en el código, de tal forma que con el error la ejecución para la variable AuxAnt era nula y las líneas donde aparecía no las ejecutaba:

Código Delphi [-]
procedure TForm1.insertarOrdenado(Vector:TC;var Lista:TC);
// Insertamos el item Vector en la Lista de manera ordenada
// La ordenación es descendente (mayor valor al principio)
var
        Aux : TC;  // Puntero de avance principal
        AuxAnt : TC; // Puntero de avance secundario (un elemento por detrás de 'Aux')
        Pivote : integer;
begin
 Pivote := Vector.Valor;
        // Si la lista está vacía inserta el item directamente
 if (Lista = nil) then
                begin
  Lista := Vector;
        end
 else
         begin
                New(Aux);
                New(AuxAnt);
         Aux := Lista;
                AuxAnt := Lista;
                // Recorremos la lista de punteros hasta encontrar el sitio
         while ((Aux <> nil) and (AuxAnt <> nil) and (Pivote < Aux.Valor)) do
                        begin
                        AuxAnt := Aux; // Esta linea no se ejecuta
          Aux := Aux.Sgte;
         end;
         // Aquí se inserta el elemento
                AuxAnt.Sgte := Vector; // Ahora SI SE EJECUTA
                // Antes había: AuxAnt := Vector; (---> ERROR)
                Vector.Sgte := Aux;
        end;
end;

Lo dicho, muchas gracias y un saludo porque ahora funciona!


La franja horaria es GMT +2. Ahora son las 01:49:27.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi