Recent

Author Topic: Largo de una cadena de caracteres  (Read 1790 times)

claudio3920

  • Newbie
  • Posts: 6
Largo de una cadena de caracteres
« 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

lainz

  • Hero Member
  • *****
  • Posts: 4468
    • https://lainz.github.io/
Re: Largo de una cadena de caracteres
« Reply #1 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?

GAN

  • Sr. Member
  • ****
  • Posts: 370
Re: Largo de una cadena de caracteres
« Reply #2 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).
Lazarus 2.0.8 FPC 3.0.4 Linux Mint Mate 19.3
Zeos 7̶.̶2̶.̶6̶ 7.1.3a-stable - Sqlite 3.32.3 - LazReport

lucamar

  • Hero Member
  • *****
  • Posts: 4219
Re: Largo de una cadena de caracteres
« Reply #3 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
Turbo Pascal 3 CP/M - Amstrad PCW 8256 (512 KB !!!) :P
Lazarus/FPC 2.0.8/3.0.4 & 2.0.12/3.2.0 - 32/64 bits on:
(K|L|X)Ubuntu 12..18, Windows XP, 7, 10 and various DOSes.

BlueIcaro

  • Hero Member
  • *****
  • Posts: 793
    • Blog personal
Re: Largo de una cadena de caracteres
« Reply #4 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

GAN

  • Sr. Member
  • ****
  • Posts: 370
Re: Largo de una cadena de caracteres
« Reply #5 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
También confundí smallint, para mí era shortint.

Claudio, la variable li_long de qué tipo es?
Lazarus 2.0.8 FPC 3.0.4 Linux Mint Mate 19.3
Zeos 7̶.̶2̶.̶6̶ 7.1.3a-stable - Sqlite 3.32.3 - LazReport

claudio3920

  • Newbie
  • Posts: 6
Re: Largo de una cadena de caracteres
« Reply #6 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