Lazarus

Other Languages => Spanish => Topic started by: claudio3920 on February 11, 2021, 05:05:09 pm

Title: Largo de una cadena de caracteres
Post by: claudio3920 on February 11, 2021, 05:05:09 pm
hola, necesito saber la cantidad de caracteres, el largo, la misma puede superar los 1000, utilicé "Utf8Length()":
 
 ls_cadena := Memo1.Text;
 li_long := Utf8Length(ls_cadena);
 StaticText1.Caption := IntToStr(li_long);   

Todo bien hasta 127 caracteres, con 128 me retorna una cantidad negativa, en la medida que es mas larga llega a 0 (cero) luego aumenta, otra vez negativo y asi continúa.
Evidentemente algo esta mal o falta algo...
gracias
Title: Re: Largo de una cadena de caracteres
Post by: OwlOfTime on February 11, 2021, 05:34:14 pm
hola, necesito saber la cantidad de caracteres, el largo, la misma puede superar los 1000, utilicé "Utf8Length()":
 
 ls_cadena := Memo1.Text;
 li_long := Utf8Length(ls_cadena);
 StaticText1.Caption := IntToStr(li_long);   

Todo bien hasta 127 caracteres, con 128 me retorna una cantidad negativa, en la medida que es mas larga llega a 0 (cero) luego aumenta, otra vez negativo y asi continúa.
Evidentemente algo esta mal o falta algo...
gracias

Que tipos de datos estas usando?
Title: Re: Largo de una cadena de caracteres
Post by: GAN on February 11, 2021, 07:00:20 pm
Me parece que estás usando un integer con el compilador en modo Free Pascal (FPC) o un shortinteger en modo OBJFPC o Delphi.

Solución 1: {$MODE OBJFPC}
Solución 2: usar Word (0 .. 65535)

En modo FPC un integer es un shortinteger (-128 .. 127) en cambio en modo OBJFPC o DELPHI un integer es un Longint (-2147483648 .. 2147483647).
Title: Re: Largo de una cadena de caracteres
Post by: lucamar on February 11, 2021, 07:56:15 pm
En modo FPC un integer es un shortinteger (-128 .. 127) [...]

No, no lo es. En modo FPC Integer son 2 bytes (word) con signo: [-32768..32767], equivalente a SmallInt, no ShortInt, como demuestra este programa:
Code: Pascal  [Select][+][-]
  1. program test;
  2.  
  3. {$mode fpc}
  4.  
  5. var
  6.  i: integer;
  7.  
  8. begin
  9.   i := 1000;
  10.   writeln('i = ',i);
  11.   writeln('Size: ',SizeOf(i));
  12.   writeln;
  13. end.

Resultado:
Code: [Select]
li = 1000
Size: 2
Title: Re: Largo de una cadena de caracteres
Post by: BlueIcaro on February 11, 2021, 10:18:01 pm
Hola, yo uso Lenght:
Code: [Select]

procedure TForm1.Button2Click(Sender: TObject);
var
  i: integer;
  Cadena: string;
begin
  for  I := 1 to 66000 do
  begin
    Cadena := Cadena + 'a';
  end;
  Memo1.Text := Cadena;
  ShowMessage(IntToStr(Length(Memo1.Text)));
end; 
En un programa recien creado, con las opciones por defecto el código de arriba devuelve 66000 tal como debería
Saludos
/BlueIcaro
Title: Re: Largo de una cadena de caracteres
Post by: GAN on February 11, 2021, 10:30:45 pm
En modo FPC un integer es un shortinteger (-128 .. 127) [...]

No, no lo es. En modo FPC Integer son 2 bytes (word) con signo: [-32768..32767], equivalente a SmallInt, no ShortInt, como demuestra este programa:
Code: Pascal  [Select][+][-]
  1. program test;
  2.  
  3. {$mode fpc}
  4.  
  5. var
  6.  i: integer;
  7.  
  8. begin
  9.   i := 1000;
  10.   writeln('i = ',i);
  11.   writeln('Size: ',SizeOf(i));
  12.   writeln;
  13. end.

Resultado:
Code: [Select]
li = 1000
Size: 2

Tienes razón. Me confundí al leer el error que marca CLaudio de 127 y -128.

Quote
The integer type maps to the smallint type in the default Free Pascal mode.
https://www.freepascal.org/docs-html/3.0.0/ref/refsu5.html (https://www.freepascal.org/docs-html/3.0.0/ref/refsu5.html)
También confundí smallint, para mí era shortint.

Claudio, la variable li_long de qué tipo es?
Title: Re: Largo de una cadena de caracteres
Post by: claudio3920 on February 12, 2021, 07:36:30 pm
Solucionado..!

Gracias a todos, era el tipo de datos, "li_largo" estaba declarada como "shortint" cuando al menos debería haber sido "smallint".
Vengo de años (desde 1996) de otros lenguajes mas simples donde no hay tantos tipos de datos (clipper 5.3/harbour, visual fox pro 9, powerbuilder 9 y 12 con mssql server), Delphi/Lazarus siempre fueron una "asignatura pendiente", un desafio al que le tuve miedo y no le dedique tiempo, pero le llego la hora..!!
Otra vez gracias..!!
TinyPortal © 2005-2018