PDA

Ver la Versión Completa : Lineas que no se ejecutan


Bauhaus1975
23-06-2006, 18:10:14
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

type
TC = ^itemC;
itemC = record
Valor : integer;
Sgte : TC;
end;


Y este es el mencionado procedimiento:

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.


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:


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!