PDA

Ver la Versión Completa : Problema Definiendo Clase en Free Pascal


gerupc
17-07-2007, 19:13:53
Hola,

mirad tengo un problema al definir una clase, el código es el siguiente:


program Project2;

{$APPTYPE CONSOLE}

uses
SysUtils;

type
Tusuario = class;
Nombre: string;
Apellidos: string;
Edad: integer;
Socio: boolean;
Codigo_Socio: integer;
procedure Mostrar_Tusuario;
end;

procedure Mostrar_Tusuario;
Begin
Writeln('Nombre: ', Nombre);
Writeln('Apellidos: ', Apellidos);
Writeln('Edad: ', Edad);

if Socio = True then
write('Si');
else if Socio = False then
write('No')
else
write('No es socio, ¡¡¡¡LADRON!!!! ');

Writeln('Socio: ', Socio);
Writeln('Codigo de Socio: ', Codigo_Socio);

var
Geru: Tusuario

begin
Geru := Tusuario.create;
Geru.Nombre := 'Geru';
Geru.Apellidos := 'García Blas';
Geru.Edad := 21;
Geru.Socio := True;
Geru.Codigo_Socio := 01;
Geru.Mostrar_Tusuario;
end.

Lo he probado tanto en FreePascal como en Delphi 7, el error en FPC es el siguiente:

First compilation of c:\fpc\proyectos en pascal\project2.pas
project2.pas(9,14) Error: Identifier not found "class"
project2.pas(9,14) Fatal: You need objFp(-S2) or Delphi (-Sd) mode to compile this module
project2.pas(9,14) Fatal: Compilation aborted

Y en Delphi 7 pues más de lo mismo.

Ya de paso una cosilla más ;), al definir como tipo de datos 'REAL' me aparece el siguiente resultado (Por ejemplo);

1.256500000000000000E+001 {Siendo el resultado. 12.56}

Un saludo, y gracias de antemano.

Geru.

seoane
17-07-2007, 19:26:33
:confused: No te sobra este punto y coma:

Tusuario = class;

gerupc
17-07-2007, 19:31:19
Holal,

gracias por contestar, ya lo he quitado, he vuelto a compilar con el Free Pascal...y exactamente el mismo error.

Un saludo,

Geru.

roman
17-07-2007, 19:50:09
Yo no sé si tenga que ver o no, pero es que hay varios errores en el código que presentas.

1. El procedimiento MostrarUsuario debe implementarse así:


procedure TUsuario.Mostrar_Tusuario;
begin
...
end;


2. Hay un ; antes de un else, que no debe ir.

3. Falta un ; en


var
Geru: Tusuario


Entonces, ¿qué tal si corriges primero todo eso y ya luego vemos? Porque en FreePascal no sé, pero en Delphi sí o sí debe compilar eso.

// Saludos

dec
17-07-2007, 19:52:47
Hola,

Yo lo que veo "raro" (luego de lo que comenta Seoane) es que estás definiendo una clase que cuenta con un método, pero, no implementas dicho método correctamente.

¿Dónde acaba? No acaba. Además parece que quieras usar en su interior varios miembros de la clase "TUsuario", pero, el procedimiento "Mostrar_Tusuario" no pertenece a dicha clase y no tendrá acceso a los miembros de esta así como así.

El asunto tendría que quedar más o menos así:


program Project1;

{$APPTYPE CONSOLE}

uses
SysUtils;

type
TUsuario = class
procedure Mostrar();
end;

{ TUsuario }

procedure TUsuario.Mostrar();
begin
// Aquí muestras lo que sea
end;

var
Usuario: TUsuario;

begin
Usuario := TUsuario.Create();
try
// Aquí usas a Usuario
finally
Usuario.Free();
end;
end.


Edito: Se me ha adelantado Román. :)

seoane
17-07-2007, 19:52:52
Bueno, el codigo tiene unos cuantos errores de sintaxis.

Si le lavabamos la cara un poco nos queda esto, que si compila en Delphi 7:

program Project2;

{$APPTYPE CONSOLE}

uses
SysUtils;

type
TUsuario = class
public
Nombre: String;
Apellidos: String;
Edad: Integer;
Socio: Boolean;
Codigo_Socio: Integer;
procedure Mostrar;
end;

procedure TUsuario.Mostrar;
begin
Writeln('Nombre: ', Nombre);
Writeln('Apellidos: ', Apellidos);
Writeln('Edad: ', Edad);
if Socio = True then
Write('Si')
else
Write('No es socio, ¡¡¡¡LADRON!!!! ');
Writeln('Socio: ', Socio);
Writeln('Codigo de Socio: ', Codigo_Socio);
end;

var
Geru: TUsuario;

begin
Geru := TUsuario.create;
Geru.Nombre := 'Geru';
Geru.Apellidos := 'García Blas';
Geru.Edad := 21;
Geru.Socio := True;
Geru.Codigo_Socio := 01;
Geru.Mostrar;
Geru.Free;
Readln;
end.


Por otro lado, el problema en freepascal puede que sea que las opciones del compilador no son correctas.

seoane
17-07-2007, 19:54:35
:D :D :D Vaya, esto si que es sincronización

dec
17-07-2007, 19:58:25
Hola,

Je, je, je... pues yo no me quedo con la gana de añadir algo: me convence más si se implementa la clase "TUsuario" en una unidad aparte. ¿Por qué? Bueno... tal vez para ganar en legilibilidad solamente, pero, creo que merece la pena aunque fuera sólo por esto. :)

gerupc
17-07-2007, 20:02:25
Aupi,

Muchas gracias, ahora lo he compilado en Delphi 7 y todo perfecto.
De todas maneras en Free Pascal me sigue dando guerra...sabes si es por que no soporta orientación a objetos o algo así??

Gracias, de veras y un saludo;

Geru.

seoane
17-07-2007, 20:12:06
Si te fijas en el mensaje de error:

project2.pas(9,14) Fatal: You need objFp(-S2) or Delphi (-Sd) mode to compile this module

Veras que te dice lo que pasa y como solucionarlo. -S2 y -Sd son parámetros del compilador, usalos en la linea de comandos a la hora de compilar.

gerupc
17-07-2007, 20:39:07
Ya lo siento, pero soy un poco novato...:o asi que no se cómo se hace.

¿Cómo podría hacerlo?

Muchas gracias y un saludo,

Geru.

gerupc
18-07-2007, 04:08:37
Hola,

lo he conseguido añadiendo:


{$MODE DELPHI}


Una cosita más, las variables que declaro del tipo 'real', el resultado me aparece con el siguiente formato:

Por ejemplo: 1.256500000000E+001

Qué puedo hacer?

Un saludo, Gracias.


Geru.

Ñuño Martínez
18-07-2007, 10:00:29
Deberías utilizar la función Format (http://lazarus-ccr.sourceforge.net/fpcdoc/rtl/sysutils/format.html) de la unidad 'sysutils'. Por ejemplo:
Texto := Format ('Valor: %.2G', [NumeroReal]); que devolverá "Valor: 1.2565".

gerupc
18-07-2007, 19:20:00
Hola nuño,

siento ser tan 'torpe' , pero no sé cómo me dices, he probado y no consigo nada, el 'texto' a qué se refiere?

Un saludo,

Geru.

roman
18-07-2007, 19:43:22
'Texto' sería una variable de tipo string en donde colocas el resultado de la función Format. En otras palabras, Format convierte NumeroReal en un string. Ese string puedes colocarlo en una variable o directamente en el Edit, Label o el control que desees para mostrar el valor.

// Saludos

seoane
18-07-2007, 19:46:59
Es como dice roman, o lo que es lo mismo:

Writeln(Format ('Valor: %.2G', [NumeroReal]));

roman
18-07-2007, 19:52:03
¡Ah, claro! Olvidaba que es una aplicación de consola :)

// Saludos

gerupc
18-07-2007, 20:02:28
Aupa,

Ok, perfecto, muchísimas gracias por vuestra ayuda, ya lo he conseguido ;)

Un saludo,

Geru.

gerupc
19-07-2007, 15:31:19
Aupa,

Al final he encontrado otra forma más sencilla para el formato de 'Real', por ejemplo:

Writeln('Prueba de numero real',numero:5:2); //Indica 5posiciones: 2 Decimales (Se amolda a las necesidades sencillamente)

Pues eso, simplemente comentarlo, por si a alguien le viene bien ;)