Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-04-2006
Avatar de alekandro
alekandro alekandro is offline
Registrado
 
Registrado: abr 2006
Posts: 3
Poder: 0
alekandro Va por buen camino
Unhappy 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;

Última edición por dec fecha: 24-04-2006 a las 18:17:09.
Responder Con Cita
  #2  
Antiguo 25-04-2006
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
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.
__________________
Delphius
[Guia de estilo][Buscar]

Última edición por Delphius fecha: 25-04-2006 a las 04:10:56.
Responder Con Cita
  #3  
Antiguo 25-04-2006
Avatar de alekandro
alekandro alekandro is offline
Registrado
 
Registrado: abr 2006
Posts: 3
Poder: 0
alekandro Va por buen camino
Unhappy 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.

Última edición por alekandro fecha: 25-04-2006 a las 15:44:09.
Responder Con Cita
  #4  
Antiguo 25-04-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 26-04-2006
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
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.

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.
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".
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #6  
Antiguo 26-04-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Cita:
Empezado por Delphius
y yo (no es que esté de malas)
¿seguro?

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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #7  
Antiguo 26-04-2006
Avatar de alekandro
alekandro alekandro is offline
Registrado
 
Registrado: abr 2006
Posts: 3
Poder: 0
alekandro Va por buen camino
Talking 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.
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
solo aparece un registro en Quickreport, ayudaaa!!! manolop Impresión 4 12-12-2007 14:11:49
No funciona Tomcat...ayudaaa clanmilano JAVA 2 23-12-2005 04:08:26
Pilas 'nuevas' al minuto Investment Noticias 0 30-03-2005 15:24:21
Direcciones estáticas o dinámicas Aprendiendo Firebird e Interbase 1 02-04-2004 01:07:08
Problemas con formularios MDI, AYUDAAA!!! Repelus Varios 18 22-02-2004 19:13:17


La franja horaria es GMT +2. Ahora son las 21:30:58.


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