Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-06-2006
Bauhaus1975 Bauhaus1975 is offline
Miembro
 
Registrado: may 2005
Ubicación: Málaga
Posts: 135
Poder: 20
Bauhaus1975 Va por buen camino
Unhappy 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.
Responder Con Cita
  #2  
Antiguo 23-06-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 23-06-2006
Bauhaus1975 Bauhaus1975 is offline
Miembro
 
Registrado: may 2005
Ubicación: Málaga
Posts: 135
Poder: 20
Bauhaus1975 Va por buen camino
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!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Saber q programas se ejecutan Diavlo Varios 1 13-05-2006 21:41:35
Una web con 225,816,744 lineas de código Jesús Pena Noticias 6 09-02-2006 07:48:35
Borrar lineas Luli Gráficos 2 29-07-2005 15:21:28
Lineas en TXT joanajj Varios 5 05-11-2004 21:09:06
lineas en Ttreeview elpezfuma OOP 4 30-05-2003 22:52:18


La franja horaria es GMT +2. Ahora son las 02:58:18.


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