Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problema al validar enteros (https://www.clubdelphi.com/foros/showthread.php?t=66173)

ioco 05-02-2010 08:56:09

Problema al validar enteros
 
Saludos!

Estoy aprendiendo a programar y tengo un problema bastante elemental con el cual espero me puedan orientar ya que no entiendo porqué no funciona.


Hice una función para validar enteros tal como la que sigue:

Código:

{
Función que lee un valor entrado y lo asigna a una variable entera si el dato
introducido es entero y que devuelve si se ha realizado la asignación.
}
Function esEntero(temp:string; out numero:integer):boolean;
  Var
    error,x:integer;

  Begin
    Val(temp,x,error);
    If error=0 then
      Begin
        numero:=x;
        esEntero:=true;
      end
    else
      esEntero:=false;
  end;

Esta función funciona bien, a no ser que exceda los límites del rango del tipo Integer.

La cuestión es que he probado usando Longint para las variables x y numero pero no entiendo porque no funciona (he leído y releído la ayuda y no encuentro el fallo).

Les adjunto lo que estoy probando:

Código:

{
Función que lee un valor entrado y lo asigna a una variable entera (64bits) si
el dato introducido es entero y que devuelve si se ha realizado la asignación.
}
Function esEntero64(temp:string; out numero:Longint):boolean;
  Var
    x:Longint;
    error:integer;

  Begin
    Val(temp,x,error);
    If error=0 then
      Begin
        numero:=x;
        esEntero64:=true;
      end
    else
      esEntero64:=false;
  end;

Por si el error estuviera a la hora de llamar la función, aunque no creo, la llamo del siguiente modo en consola:

Código:

Var
  temporal:string;
  entero64:Longint;

Begin
  Repeat
    Write(' Introduce un entero: ');
    Readln(temporal);
  until esEntero64(temporal,entero64);
  Writeln(' El numero introducido es: ',entero64);
Readln;
end.

¿Podrían darme alguna sugerencia?

roman 05-02-2010 09:50:39

No comentas cuál es el fallo. Pero lo que te puedo decir es que LongInt es lo mismo que Integer, al menos para el compilador de 32 bits (desconozco si delphi tiene ya compilador de 64 bits). Existe el tipo de dato Int64 para 64 bits.

// Saludos

ioco 05-02-2010 11:40:24

Gracias por el apunte sobre el integer, fallo mío a la hora de consultar mis notas sobre los tipos.

Perdón por no haber dejado claro el fallo. Lo que sucede es que cuando ejecuto el programa principal, cuando el usuario ingresa un número mayor que el máximo de un integer no sale del repeat a pesar de que los tipos utilizados son Int64 (ya los he cambiado) y si no voy mal deberían de poder admitir un número mayor.

¿Quizá sea porque el procedure Val no admite int64?

Aunque de lo siguiente (extraído del help de delphi), entiendo que sí ya que Int64 es un tipo de dato entero ¿no?
Cita:

procedure Val(S; var V; var Code: Integer);

(...)V is an integer-type or real-type variable.(...)

rgstuamigo 05-02-2010 14:28:00

Y por que no utilizas la funcion TryStrToInt de la unidad SysUtils para hacer la conversion: ejemplo:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var Valor_En_Entero:Integer;
begin
 if TryStrToInt(Edit1.Text,Valor_En_Entero) then //if tengo exito al convertir
    ShowMessage('Ha sido todo un exito la conversion')
 else ShowMessage('Ha sido un fracaso la conversion');

end;
Saludos...:)

ioco 05-02-2010 15:22:56

Gracias, ¡me ha sido muy útil!

No conocía esa función y hace exactamente lo mismo que la que estaba intentando hacer yo y encima ya viene implementada jeje

Gracias por vuestro tiempo ^^


La franja horaria es GMT +2. Ahora son las 00:35:59.

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