Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problema con asignar valor nil a un puntero (https://www.clubdelphi.com/foros/showthread.php?t=76737)

kdemia 23-11-2011 23:35:04

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 !

Al González 23-11-2011 23:45:55

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). :)

kdemia 23-11-2011 23:48:42

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.

Al González 23-11-2011 23:59:06

"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? :)

kdemia 24-11-2011 00:02:38

En la respuesta anterior copie el codigo del Form.. Disculpen pero es la primera vez que programo directamente con objetos en Delphi.

kdemia 24-11-2011 00:11:00

Resuelto, me faltaba el contructor del objeto, no me habia dado cuenta muchas gracias por hacerme dar cuenta :D

Al González 24-11-2011 00:11:17

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.

kdemia 24-11-2011 00:21:46

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?

Al González 24-11-2011 00:47:21

Cita:

Empezado por kdemia (Mensaje 419302)
[...] 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. :)

kdemia 24-11-2011 02:38:32

Uso delphi 2010.. y como seria? o abro otro thread? :p

kdemia 24-11-2011 03:26:02

Nuevamente Resuleto xD con T como en java :p

Al González 24-11-2011 03:30:05

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. :)


La franja horaria es GMT +2. Ahora son las 17:36:36.

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