Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Ayudaaa Pilas estaticas (https://www.clubdelphi.com/foros/showthread.php?t=30949)

alekandro 24-04-2006 17:33:47

Ayudaaa Pilas estaticas
 
Espero que alguien me pueda ayudar. Soy nuevo en el mundo de delphi, y bueno como todos los que poco sabemos de un tema, preguntamos.
Es la primera vez que pongo dentro de un objeto un arreglo, y creo que ese es el problema.
Mi dice el compilador que hay problemas con la inicializacion de la variable pila. Así es el warning que me muestra cuando lo compilo.
Es una advertencia, sigo entonces. Al seguir todo el probrama con F7 (linea por linea) ejecuta pila.crear (desde algortmo principal), me abre todo correcto la unit de pila, y al hacer cima:=0, dentro de tpila.crear me muestra esto:

PROJECT PALINDROMO.EXE RAISED EXCEPTION CLASS EACCESSVIOLATION WITH MESSAGE 'ACCESS VIOLATION AT ADDRESS 0044EE8C IN MODULE 'PALINDROMO.EXE'. WRITE OF ADDRESS 004280B8'. PROCESS STOPPED.

Esta es la unit de pilas que tengo hecha yo:

Código Delphi [-]
unit Pilas;

interface

const
  max=10;

type
  tdato=char;
  tpila=class
  cima:0..max;
  elem:array[1..max]of tdato;

  function vacia:boolean;
  function llena:boolean;
  procedure crear;
  procedure poner (var ele:tdato);
  procedure sacar (var ele:tdato);
end;

implementation

function tpila.vacia:boolean;
begin
  vacia:=(cima=0);
end;

function tpila.Llena:boolean;
begin
  llena:=(cima=max);
end;

procedure tpila.crear;
begin
  cima:=0;
end;

procedure tpila.poner(var ele:tdato);
begin
  cima:=cima+1;
  elem[cima]:=ele;
end;

procedure tpila.sacar(var ele:tdato);
var
  i:integer;
begin
  for i:=1 to cima-1 do
    elem[i]:=elem[i+1];
  cima:=cima-1
end;

end.

Las formas que vi para inicializar que vienen con Delphi son el new( ) y el create. Pero a ambos le tengo que asignar un puntero, no los puedo usar aca.
Si alguien me da una mano se lo agradeceria. Y si necesitan mas datos preguintenme.
Saludos;

Delphius 25-04-2006 04:07:49

Creo que va por aquí....
 
viendo tu código, te diría:
1)Declara todos los tipos de datos que use la pila fuera:

Código Delphi [-]
type
  tdato=char;

2) Segundo.... define el ámbito de las variables y funciones y/o procedimientos: son públicas?Son privadas?
Por ejemplo quedaría:

Código Delphi [-]
tpila=class
  public
  // variables públicas
  cima:0..max;
  elem:array[1..max]of tdato;
  // procedimientos y funciones
  function vacia:boolean;
  function llena:boolean;
  procedure crear;
  procedure poner (var ele:tdato);
  procedure sacar (var ele:tdato);
end;

Cita:

Empezado por alekandro
Las formas que vi para inicializar que vienen con Delphi son el new( ) y el create. Pero a ambos le tengo que asignar un puntero, no los puedo usar aca.

Algo así. Es Create.

Para ello debes definir un constructor en la definición de la clase:

Código Delphi [-]
constructor create

Y luego, (en la implementación) ingresas el código que deseas que se ejecute.
En tu caso sería crear(). Puedes , si deseas, definir el constructor de manera que reciba parámetros.
También puedes definir un destructor:

Código Delphi [-]
Destructor destroy

Espero que te sirva.

alekandro 25-04-2006 15:34:10

Debe ser otra cosa
 
Gracias Delphius por la ayuda, pero me sigue diciendo las mismas cosas.
El problema me parece que viene por otro lado. Te muestro el procedimiento que lo llama es asi:

Código Delphi [-]
 procedure comienzo;
  var
   pila:tpila;
   i:integer;
   palabra:string;
 begin
   i:=0;
   palabra:=form1.Edit1.Text;
   pila.crear;
   while (not pila.llena) and (form1.Edit1.Text[i+1]<>'') do
    begin
      i:=i+1;
      pila.poner(palabra[i]);
    end;
 end;
Cuando lo compilo me dice:
[Warning] Main.pas(38): Variable 'pila' might not have been initialialized.

Asi me quedo la unit de pilas, luego de los consejos que me diste. Quizas estoy haciendo algo mal aqui:
Código Delphi [-]
  unit Pilas;
   interface
    const max=10;
    type
     tdato=char;
    type
     tpila=class
       public
       // variables públicas
       cima:0..max;
       elem:array[1..max]of tdato;
       // procedimientos y funciones
       function vacia:boolean;
       function llena:boolean;
       procedure crear;
       procedure poner (var ele:tdato);
       procedure sacar (var ele:tdato);
     end;
 implementation
  function tpila.vacia:boolean;
   begin
    vacia:=(cima=0);
   end;
  function tpila.Llena:boolean;
   begin
     llena:=(cima=max);
   end;
  procedure tpila.crear;
   begin
    cima:=0;
   end;
  procedure tpila.poner(var ele:tdato);
   begin
    cima:=cima+1;
    elem[cima]:=ele;
   end;
  procedure tpila.sacar(var ele:tdato);
   var
     i:integer;
   begin
     for i:=1 to cima-1 do
       elem[i]:=elem[i+1];
     cima:=cima-1
   end;
  end.

Si lo ejecuto linea a linea, cuando entra en el pila.crear cuando le va a asignar a cima 0, es cuando ocurre la catastrofe, jajaj

Delphius de verdad, gracias por tu ayuda. :)

Lepe 25-04-2006 20:23:10

Lo que Delphius te dijo es:

Código Delphi [-]
 unit Pilas;
   interface
    const max=10;
    type
     tdato=char;
    type
     tpila=class
       public
       // variables públicas
       cima:0..max;
       elem:array[1..max]of tdato;
       // procedimientos y funciones
       function vacia:boolean;
       function llena:boolean;
    Constructor Create;
    Destructor Destroy;
       procedure poner (var ele:tdato);
       procedure sacar (var ele:tdato);
     end;
 implementation
  function tpila.vacia:boolean;
   begin
    vacia:=(cima=0);
   end;
  function tpila.Llena:boolean;
   begin
     llena:=(cima=max);
   end;
  Constructor tpila.Create;
   begin
       inherited; // herencia amigo.
    cima:=0;
   end;
  Destructor Tpila.Destroy;
  begin
     // liberar lo que sea
     inherited;
  end;
  
  procedure tpila.poner(var ele:tdato);
   begin
    cima:=cima+1;
    elem[cima]:=ele;
   end;
  procedure tpila.sacar(var ele:tdato);
   var
     i:integer;
   begin
     for i:=1 to cima-1 do
       elem[i]:=elem[i+1];
     cima:=cima-1
   end;
  end.

Y la forma de usarlo:
Código Delphi [-]
 procedure comienzo;
  var
   pila:tpila;
   i:integer;
   palabra:string;
 begin
   i:=0;
   palabra:=form1.Edit1.Text;
   pila := Tpila.create; // aqui estaba el fallito
   while (not pila.llena) and (form1.Edit1.Text[i+1]<>'') do
    begin
      i:=i+1;
      pila.poner(palabra[i]);
    end;
 end;
Eso sin ver los fallos internos que pueda tener la pila, que no lo he mirado ;)

Saludos

Delphius 26-04-2006 04:26:41

Pues... debí ser más claro...
 
Cita:

Empezado por Lepe
Lo que Delphius te dijo es

Si y no... lo dije "indirectamente", pensaba que se daba a entender que debía llamar a Create() antes usar el objeto instanciado.:p :D

Si lo hubiera explicado mejor, con mayores detalles... tal vez.... alekandro ya lo hubiera tenido solucionado. Daba por entendido con mi explicación cómo debía proceder. :rolleyes:
No quería poner tanto código... pues... sería como darlo de "regalo", y yo (no es que esté de malas) creo que se debe entender bien algunas ideas iniciales como para la otra persona pueda sacarlo. Algo como "yo te tiro la pelota... tu juegas".;)

Lepe 26-04-2006 08:31:53

Cita:

Empezado por Delphius
y yo (no es que esté de malas)

¿seguro? :p :p :D :D

El código no es lo importante, lo importante es por qué está escrito así, por qué inherited se pone antes o despues, ahí es donde ... una vez visto el código, hay que estudiarlo, y eso es tarea del amigo alekandro ;)

Saludos ;)

alekandro 26-04-2006 14:04:11

Solucionado
 
Gracias muchachos :) , de aqui en adelante voy a intentar continuar solo, Delphius no te preocupes que fue tal como vos querias ;) .

Lo que me dio Lepe fue un empujoncito, aun me faltan muchas cosas por resolver.

Lo bueno fue que me dieron una mano, estaba trabado desde hace tiempo. Como dije soy nuevo en esto y todo lo que estuve averiguando por internet no me resolvia esa duda, lo entenderian como una tonteria quizas, gracias amigos.


La franja horaria es GMT +2. Ahora son las 12:22:43.

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