Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros temas > La Taberna
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-03-2024
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.003
Poder: 26
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Unhappy Enlaces sin punteros

¿Confundidos? Pues agárrense, que vienen curvas.

Estoy leyendo Algoritmos + Estructuras de datos = Programas, del bueno de Kiklaus Wirth, porque encontré una primera edición en inglés (como curiosidad, fue el libro que provocó que Anders Hejlsberg escribiera Turbo Pascal 1.0).

La cosa es que me he atascado con un concepto en la página 19, porque por más vueltas que le doy no entiendo qué dice. Está hablando de registros (record) y listas, y habla de que se puede crear una lista doblemente enlazada añadiendo un campo más y haciendo una suma o una resta. El texto original:



No incluye código de ejemplo. He probado varias implementaciones a ver si así lograba entender algo, pero no hay manera: no consigo que recorra toda la lista ni para atrás ni para delante. Pongo la primera que hice, que es la más naïf, para que veáis la estructura básica.
Código Delphi [-]
program RegsistrosEnlazados;
(* Intento de implementación del sistema de enlazado explicado en A+D=P.  *)

type
(* Para identificar mejor. *)
  TSexo = (Masculino, Femenino);
(* Contiene información de personas. *)
  TPersona = record
    Nombre: String;
    Sexo: TSexo;
    Link: Integer
  end;
var
(* Información (extraído del libro). *)
  Personas: array [1..10] of TPersona = (
    (Nombre: 'Carolyn';  Sexo: Femenino;  Link: 2),
    (Nombre: 'Chris';    Sexo: Masculino; Link: 2),
    (Nombre: 'Tina';     Sexo: Femenino;  Link: 5),
    (Nombre: 'Robert';   Sexo: Masculino; Link: 3),
    (Nombre: 'Jonathan'; Sexo: Masculino; Link: 3),
    (Nombre: 'Jennifer'; Sexo: Femenino;  Link: 5),
    (Nombre: 'Raytheon'; Sexo: Masculino; Link: 5),
    (Nombre: 'Mary';     Sexo: Femenino;  Link: 3),
    (Nombre: 'Anne';     Sexo: Femenino;  Link: 1),
    (Nombre: 'Mathias';  Sexo: Masculino; Link: 3)
  );

(* Elemento siguiente. *)
  function SiguienteIndice (x, y: Integer): Integer;
  begin
    SiguienteIndice := x + Personas[y].Link
  end;



(* Elemento anterior. *)
  function AnteriorIndice (x, y: Integer): Integer;
  begin
    AnteriorIndice := x - Personas[y].Link
  end;

var
  Ndx: Integer;
begin
  Ndx := 1;
  repeat
    WriteLn ('Nombre: ', Personas[Ndx].Nombre);
    Ndx := SiguienteIndice (Ndx - 1, Ndx)
  until (1 > Ndx) or (Ndx > High (Personas))
end.

De ahí he intentado varias cosas bastante más complejas, como intentar llevar la cuenta del elemento anterior (I^k-1) y el actual (i^k), pero no lo pillo.

Tampoco me va la vida en ello, pero si alguien me da una pista, o una implementación que funcione, pues se agradecerá. Yo, de momento, me paso al capítulo siguiente, que la neurona no me da para más.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine

Última edición por Ñuño Martínez fecha: 06-03-2024 a las 12:14:19. Razón: Olvidé cómo se ponía el destacado de sintaxis para Pascal/Delphi.
Responder Con Cita
  #2  
Antiguo 06-03-2024
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.264
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Parece que no tiene lógica, a ver si es un error y en la siguiente edición del libro sacaron una "fe de erratas" de la primera versión
Responder Con Cita
  #3  
Antiguo 06-03-2024
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.264
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Aquí está en español, creo que lo que enlaza es masculino/femenino, y no el siguiente registro, no sé


Responder Con Cita
  #4  
Antiguo 06-03-2024
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.927
Poder: 26
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Aquí está en español, creo que lo que enlaza es masculino/femenino, y no el siguiente registro, no sé
Si, eso es lo que dice el texto en ingles.


---


La idea general se llama una estructura de "Arena":

https://dev.to/deciduously/no-more-t...s-in-rust-44k6

basicamente, reemplazar por indices numericos lo que es un puntero. Es muy simple de usar, pero claro todo depende de los datos a enlazar.

P.d: Tengo un ejemplo de usar arenas para un arbol:

https://elmalabarista.com/blog/2022-flat-tree/
__________________
El malabarista.
Responder Con Cita
  #5  
Antiguo 08-03-2024
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.003
Poder: 26
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Tengo que darle una lectura más profunda a lo que pones, mamcx, porque así de primeras y con una lectura rápida sigo sin enterarme. Gracias por los enlaces.

Y la traducción que pones, Casi, parece confirma que mi traducción es correcta. Yo también he sospechado que podría haber algún error en la edición que estoy leyendo.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine

Última edición por Ñuño Martínez fecha: 12-03-2024 a las 12:48:07.
Responder Con Cita
  #6  
Antiguo 12-03-2024
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.003
Poder: 26
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Pues como [casi] siempre que leo uno de estos artículos sobre temas esotéricos, me quedo con la sensación de que el autor presupone que sé algo que no sé. No sé si tiene que ver con que no tengo ni idea de Rust o si es otra cosa. De todas formas, he estado buscando y creo que lo que propone Wirth no tiene nada que ver con eso de las Arenas. Puede que esté equivocado, pero no he visto ninguna relación entre Arena Allocation y lo que se explica en A+D=P.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #7  
Antiguo 12-03-2024
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.927
Poder: 26
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Cita:
Empezado por Ñuño Martínez Ver Mensaje
pero no he visto ninguna relación entre Arena Allocation y lo que se explica en A+D=P.
Lo que Wirth explica es el algoritmo y una version simple de la estructura. La "Arena" es una aplicación concreta para que ademas, sirva para manejar memoria.

Ya que estamos hablando de punteros, es de hecho, un "memory manager". En estos días es mas fácil que encuentres recursos usando "Arena" como keyword, porque como se nombra esta idea? En fin.


---


Resumiendo: Todo el truco es como usas un indice numerico en un array para reemplazar un puntero. Como construyes ese mapeo varia de acuerdo a la estructura que deseas emular (vector, árbol, grafo, ...) y que operaciones(ges) deseas optimizar.
__________________
El malabarista.
Responder Con Cita
  #8  
Antiguo 15-07-2024
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.003
Poder: 26
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Sigo sin pillarlo.

Lo peor de todo es que la implementación típica del algoritmo de compresión LZSS (que usan un montón de programas, como LHA y Allegro) usa este sistema para indexar el buffer donde busca las coincidencias, pero por más que lo leo (en Allegro 1-4 está bastante claro) sigo sin entender cómo funciona.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #9  
Antiguo 05-10-2024
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 245
Poder: 1
navbuoy Va por buen camino
lo de enlaza creo que se refiere al campo "sexo"

Ejemplo de lista enlazada sin punteros explícitos usando clases:

Código:
type
  TNode = class
    Data: Integer;
    Next: TNode;  // Aquí seguimos apuntando al siguiente nodo, pero sin punteros explícitos
  end;

  TLinkedList = class
  private
    Head: TNode;
  public
    procedure AddNode(Value: Integer);
    procedure PrintList;
    procedure Clear;
  end;

Implementación de métodos:

Código:
procedure TLinkedList.AddNode(Value: Integer);
var
  NewNode: TNode;
begin
  // Creamos un nuevo nodo
  NewNode := TNode.Create;
  NewNode.Data := Value;
  NewNode.Next := Head;  // El nuevo nodo apunta a la cabeza actual
  Head := NewNode;       // La cabeza ahora es el nuevo nodo
end;

procedure TLinkedList.PrintList;
var
  Current: TNode;
begin
  Current := Head;
  while Current <> nil do
  begin
    WriteLn(Current.Data);  // Mostramos el dato actual
    Current := Current.Next; // Avanzamos al siguiente nodo
  end;
end;

procedure TLinkedList.Clear;
var
  Temp: TNode;
begin
  while Head <> nil do
  begin
    Temp := Head;
    Head := Head.Next;
    Temp.Free;  // Liberamos la memoria del nodo
  end;
end;

ejemplo de Uso:

Código:
var
  List: TLinkedList;
begin
  List := TLinkedList.Create;

  List.AddNode(10);
  List.AddNode(20);
  List.AddNode(30);

  List.PrintList;  // Muestra 30, 20, 10

  List.Clear;      // Limpia la lista y libera memoria

  List.Free;       // Libera la instancia de la lista
end.

Última edición por navbuoy fecha: 05-10-2024 a las 12:40:00.
Responder Con Cita
  #10  
Antiguo Hace 4 Semanas
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.609
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
navbuoy: Aunque no sea un puntero explícito, sigue siendo un puntero. Todas las referencias a instancias de clases Delphi lo son. :-)

Ñuño: ¿en qué fase de comprensión vas? Yo no entendí nada todavía pero ¿cuál es tu duda medular? ¿Puedes reducirla a su mínima expresión? Tal vez me anime a echarle un vistazo con calma en estos días.

Edito: Bueno, agregaría que al parecer el registro contiene un campo que indica su posición en una matriz unidireccional (vulgarmente conocida como "arreglo"), y eso, un índice por elemento (persona), es suficiente para que pueda conocerse, a partir de un registro, cuál es el siguiente o el anterior registro de la matriz. Diría que tiene la ventaja de que con un solo campo de tipo Integer puedes "enlazar" al registro predecesor y al registro sucesor, cosa que en otros escenarios vemos resuelto con el uso de dos campos punteros en cada record (necesitando más memoria).

Un confuso abrazo.

Al González.
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
punteros pepe_baile C++ Builder 4 24-07-2016 12:19:57
Punteros kotai Varios 1 09-08-2010 17:26:34
uso de punteros David OOP 19 14-12-2009 10:48:37
C++ y los punteros marcoszorrilla La Taberna 3 02-06-2008 19:31:11
Punteros davitcito Varios 2 25-04-2005 23:46:24


La franja horaria es GMT +2. Ahora son las 20:03:32.


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