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-11-2011
kdemia kdemia is offline
Miembro
 
Registrado: may 2010
Posts: 109
Poder: 14
kdemia Va por buen camino
Question Problema con asignar valor nil a un puntero

Que tal comunidad, se me presento un problema a la hora de asignar y comparar un puntero con el valor nil.. me sale la excepcion "EAccessViolation" cuando se ejecutan las lineas en rojo, seguramente haya mas "EAccessViolation" pero si resuelvo esas dos resuelvo todos..

Codigo:

Código Delphi [-]
unit Cola;

interface

type


TDataCola = String;
PNodoCola = ^TNodoCola;
TNodoCola = record
  Data      : TDataCola;
  Siguiente : PNodoCola;
end;
TCola = class
  public
    procedure Create;
    procedure Free;
    procedure Push  ( Data : TDataCola );
    function  Pop   : TDataCola;
    function  Empty : Boolean;
  private
    Primero, Ultimo: PNodoCola;
end;

implementation

procedure TCola.Create;
begin
  Primero := Nil;
  Ultimo  := Nil;
end;

procedure TCola.Free;
var
  Aux : PNodoCola;
begin
  Ultimo := Nil;
  while not Empty do
  begin
    Aux     := Primero;
    Primero := Primero^.Siguiente;
    Dispose(Aux);
    Aux     := Nil;
  end;
end;

procedure TCola.Push(Data: TDataCola);
var
  Aux : PNodoCola;
begin
  New(Aux);
  Aux^.Data      := Data;
  Aux^.Siguiente := Nil;
  if Empty then
    Primero := Aux
  else
    Ultimo^.Siguiente := Aux;
  Ultimo := Aux;
end;

function  TCola.Pop;
var
  Aux : PNodoCola;
begin
  Result  := Primero^.Data;
  Aux     := Primero;
  Primero := Primero^.Siguiente;
  Dispose(Aux);
  Aux     := Nil;
end;

function  TCola.Empty;
begin
  Result := Primero = Nil;
end;

end.

Gracias y Saludos !
Responder Con Cita
  #2  
Antiguo 23-11-2011
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
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
Hola.

Tendrías que dar información más detallada, pero el problema podría estar en la forma en que estés llamando al constructor Create de TCola. ¿Podrías mostrarnos eso? También se agradecería si pudieras poner una copia exacta del mensaje de error (oprime Ctrl+C cuando aparezca).
Responder Con Cita
  #3  
Antiguo 23-11-2011
kdemia kdemia is offline
Miembro
 
Registrado: may 2010
Posts: 109
Poder: 14
kdemia Va por buen camino
El error es :

Cita:
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 004B5657 in module 'Project1.exe'. Write of address 00000008'.
Igualmente el metodo create esta demas, era para ver si el problema se encontraba en la asignacion esa.. pero no tendria porque pasar, osea si hago una cola de manera procedural funciona perfectamente, el problema esta en hacerlo en poo.

Igualmente tmb dejo el codigo del Form principal.

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Cola, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Cola : TCola;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Cola.Push(Edit1.Text);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ShowMessage(Cola.Pop);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Cola.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Cola.Free;
end;

end.

Última edición por kdemia fecha: 23-11-2011 a las 23:53:41.
Responder Con Cita
  #4  
Antiguo 23-11-2011
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
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
"Write of address 00000008" indica que estás tratando de asignar (escribir) en una dirección de memoria muy baja. Como si tuvieras un objeto TCola sin "instanciar", es decir, un objeto Nil, y quisieras escribir en uno de los campos de dicho objeto. La dirección 8, correspondería al campo Ultimo de tal objeto Nil.

Pero, para no especular más, ¿podrías mostrar el código de cómo estás creando y usando objetos TCola?
Responder Con Cita
  #5  
Antiguo 24-11-2011
kdemia kdemia is offline
Miembro
 
Registrado: may 2010
Posts: 109
Poder: 14
kdemia Va por buen camino
En la respuesta anterior copie el codigo del Form.. Disculpen pero es la primera vez que programo directamente con objetos en Delphi.
Responder Con Cita
  #6  
Antiguo 24-11-2011
kdemia kdemia is offline
Miembro
 
Registrado: may 2010
Posts: 109
Poder: 14
kdemia Va por buen camino
Resuelto, me faltaba el contructor del objeto, no me habia dado cuenta muchas gracias por hacerme dar cuenta
Responder Con Cita
  #7  
Antiguo 24-11-2011
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
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
No te preocupes kdemia, aquí todos aprendemos algo nuevo todos los días.

Bien, veo que editaste tu mensaje para poner el código que deseaba ver. Es lo que me temía. Te falta crear la instancia del objeto. La sintaxis es:
Código Delphi [-]
Cola := TCola.Create;
Y para destruirlo:
Código Delphi [-]
Cola.Free;

Adicionalmente, es aconsejable que no crees un método llamado Free para las tareas de finalización / liberación (el método Free ya existe en la clase base TObject). Lo recomendable es definir un destructor llamado "Destroy", declarándolo además con la directiva Override. Así, cuando llames al método Free (el nativo que TCola hereda de TObject), éste llamará a tu destructor para liberar los elementos de la lista.

En el foro encontrarás mucho material y ejemplos sobre definición de clases con constructores y destructores.

Por otro lado, considera que en Delphi ya existen varias clases nativas de propósito similar a TCola.

Saludos.
Responder Con Cita
  #8  
Antiguo 24-11-2011
kdemia kdemia is offline
Miembro
 
Registrado: may 2010
Posts: 109
Poder: 14
kdemia Va por buen camino
Genial, muchas gracias, si con respecto al destructor me di cuenta tarde xD jajaja, te hago una pregunta adicional, puedo llegar a hacer una Cola generica, algo asi como el <T> de Java?
Responder Con Cita
  #9  
Antiguo 24-11-2011
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
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
Cita:
Empezado por kdemia Ver Mensaje
[...] puedo llegar a hacer una Cola generica, algo asi como el <T> de Java?
Sí, pero sólo a partir de Delphi 2009. Esta característica llamada "genéricos" no existe en versiones anteriores. ¿Cuál versión usas tú?

Por cierto, si este hilo se llegara a desviar del tema original, abrir uno nuevo no sería mala idea.
Responder Con Cita
  #10  
Antiguo 24-11-2011
kdemia kdemia is offline
Miembro
 
Registrado: may 2010
Posts: 109
Poder: 14
kdemia Va por buen camino
Uso delphi 2010.. y como seria? o abro otro thread?
Responder Con Cita
  #11  
Antiguo 24-11-2011
kdemia kdemia is offline
Miembro
 
Registrado: may 2010
Posts: 109
Poder: 14
kdemia Va por buen camino
Nuevamente Resuleto xD con T como en java
Responder Con Cita
  #12  
Antiguo 24-11-2011
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
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
Hay un par de artículos que a simple vista me parecen recomendables:

http://sjrd.developpez.com/delphi/tutoriel/generics/

http://www.drbob42.com/examines/examinA6.htm

Saludos.
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
Problema al asignar valor a array ferjavrec2 OOP 6 06-03-2011 22:14:33
Error al asignar un valor ioco Lazarus, FreePascal, Kylix, etc. 3 14-02-2010 15:06:59
Problema al asignar valor antes de visualizar el form drykea Varios 20 19-01-2009 17:38:37
Asignar valor a un DBLOOKUPCOMBOBOX lucasarts_18 OOP 3 30-10-2005 23:35:21
Asignar el valor de DayOfTheWeek a una variable gluglu Varios 7 23-01-2005 19:47:47


La franja horaria es GMT +2. Ahora son las 16:12:10.


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