Recent

Author Topic: Limite String  (Read 7036 times)

JuanCP

  • New Member
  • *
  • Posts: 14
Re: Limite String
« Reply #15 on: September 09, 2022, 09:06:44 am »
Buenos días.

Delphi compila sin errores y genera ejecutable, pero este ultimo no funciona. (imagen1). Si muestra la longitud correcta del string.(imagen2).

FPC muestra la longitud maxima del tipo string (255) pero no la longitud real de la cadena almacenada. (imagen3).


Desde mi punto de vista como aficionado, esto es una deficiencia en fpc y en menor medida en delphi.

Si la variable no es inicializada, se entiende logicamente que la longitud es la maxima, pero si le das un valor,  la longitud de la variable deberia ser el tamaño de la cadena asignada.

Delphi si añade el valor correcto a la cadena, pero no da error al compilar y genera ejecutable que no funciona.

he realizado estas pruevas en java y python con resultados identicos, ambos generan error por intentar acceder a una posicion  mayor que la longitud de la cadena.

BlueIcaro

  • Hero Member
  • *****
  • Posts: 792
    • Blog personal
Re: Limite String
« Reply #16 on: September 09, 2022, 09:22:07 am »
Hola, es curioso porque este código:
Code: [Select]
program Project1;

var
  frase: String;
begin
  frase := 'Esto es una prueba';
  WriteLn(frase);
  WriteLn(High(frase));
  Readln();
end.
     
Creado y compilado en w11, con la última versión estable de Lazarus, arroja un valor correcto. Como se puede ver en la imagen adjunta,

Saludos

/BlueIcaro

Fred vS

  • Hero Member
  • *****
  • Posts: 3168
    • StrumPract is the musicians best friend
Re: Limite String
« Reply #17 on: September 09, 2022, 12:09:47 pm »
Hola, es curioso porque este código:
Code: [Select]
program Project1;

var
  frase: String;
begin
  frase := 'Esto es una prueba';
  WriteLn(frase);
  WriteLn(High(frase));
  Readln();
end.
     
Creado y compilado en w11, con la última versión estable de Lazarus, arroja un valor correcto. Como se puede ver en la imagen adjunta,

Saludos

/BlueIcaro

Hola.

Quote
con la última versión estable de Lazarus

Y con que version de fpc?
Aquí con fpc 3.2.2 linux amd64 tengo 255.
I use Lazarus 2.2.0 32/64 and FPC 3.2.2 32/64 on Debian 11 64 bit, Windows 10, Windows 7 32/64, Windows XP 32,  FreeBSD 64.
Widgetset: fpGUI, MSEgui, Win32, GTK2, Qt.

https://github.com/fredvs
https://gitlab.com/fredvs
https://codeberg.org/fredvs

Fred vS

  • Hero Member
  • *****
  • Posts: 3168
    • StrumPract is the musicians best friend
Re: Limite String
« Reply #18 on: September 09, 2022, 01:59:56 pm »
Si la variable no es inicializada, se entiende logicamente que la longitud es la maxima, pero si le das un valor,  la longitud de la variable deberia ser el tamaño de la cadena asignada.

Me parece que lo más lógico es que, para fpc, el resultado sea el mismo para Linux y Windows.
Y parece que no es así.
Para mí, es un "bug".
I use Lazarus 2.2.0 32/64 and FPC 3.2.2 32/64 on Debian 11 64 bit, Windows 10, Windows 7 32/64, Windows XP 32,  FreeBSD 64.
Widgetset: fpGUI, MSEgui, Win32, GTK2, Qt.

https://github.com/fredvs
https://gitlab.com/fredvs
https://codeberg.org/fredvs

paweld

  • Hero Member
  • *****
  • Posts: 998
Re: Limite String
« Reply #19 on: September 09, 2022, 02:20:07 pm »
en Windows y Linux el resultado es el mismo:
Code: Pascal  [Select][+][-]
  1. program project1;
  2.  
  3. {$mode objfpc}{$H+}
  4. // {$H+} -> 18
  5. // {$H-} -> 255
  6.  
  7. var
  8.   frase: String;
  9. begin
  10.   frase := 'Esto es una prueba';
  11.   WriteLn(frase);
  12.   WriteLn(High(frase));
  13.   Readln();
  14. end.
  15.  
Si LONGSTRINGS está habilitado se devuelve la longitud de la variable, si está deshabilitado se devuelve el tamaño de la cadena, para ShortString es 255.
Best regards / Pozdrawiam
paweld

Fred vS

  • Hero Member
  • *****
  • Posts: 3168
    • StrumPract is the musicians best friend
Re: Limite String
« Reply #20 on: September 09, 2022, 02:41:23 pm »
en Windows y Linux el resultado es el mismo:
Code: Pascal  [Select][+][-]
  1. program project1;
  2.  
  3. {$mode objfpc}{$H+}
  4. // {$H+} -> 18
  5. // {$H-} -> 255
  6.  
  7. var
  8.   frase: String;
  9. begin
  10.   frase := 'Esto es una prueba';
  11.   WriteLn(frase);
  12.   WriteLn(High(frase));
  13.   Readln();
  14. end.
  15.  
Si LONGSTRINGS está habilitado se devuelve la longitud de la variable, si está deshabilitado se devuelve el tamaño de la cadena, para ShortString es 255.

@paweld: Sí, lo tienes: {$H+}!   ;D

Code: Pascal  [Select][+][-]
  1.    program cadena;
  2.    {$mode objfpc}{$H+}
  3.         var
  4.        frase: string = 'Hola';
  5.     begin
  6.         writeln((high(frase)));
  7.     end.

-->

Code: Bash  [Select][+][-]
  1. fred@fred-80m0 ~> ./cadena
  2. 4

Entonces, en resumen, para un resultado que dé una longitud variable (como en Delphi o Python), use {$H+}.
((¿Por qué no usarlo por predeterminado?)
« Last Edit: September 09, 2022, 02:51:50 pm by Fred vS »
I use Lazarus 2.2.0 32/64 and FPC 3.2.2 32/64 on Debian 11 64 bit, Windows 10, Windows 7 32/64, Windows XP 32,  FreeBSD 64.
Widgetset: fpGUI, MSEgui, Win32, GTK2, Qt.

https://github.com/fredvs
https://gitlab.com/fredvs
https://codeberg.org/fredvs

Fred vS

  • Hero Member
  • *****
  • Posts: 3168
    • StrumPract is the musicians best friend
Re: Limite String
« Reply #21 on: September 09, 2022, 03:03:20 pm »
También funciona con {$mode delphi}  (que seguramente debe usar {$H+} )

Code: Pascal  [Select][+][-]
  1.     program cadena;
  2.    {$mode delphi}
  3.         var
  4.        frase: string = 'Hola';
  5.     begin
  6.         writeln((high(frase)));
  7.     end.
« Last Edit: September 09, 2022, 03:06:30 pm by Fred vS »
I use Lazarus 2.2.0 32/64 and FPC 3.2.2 32/64 on Debian 11 64 bit, Windows 10, Windows 7 32/64, Windows XP 32,  FreeBSD 64.
Widgetset: fpGUI, MSEgui, Win32, GTK2, Qt.

https://github.com/fredvs
https://gitlab.com/fredvs
https://codeberg.org/fredvs

JuanCP

  • New Member
  • *
  • Posts: 14
Re: Limite String
« Reply #22 on: September 09, 2022, 03:06:18 pm »
paweld, de acuerdo aplicando la directiva {$H+} conseguimos que fpc nos devuelva la longitud real de la cadena.
Pero, el problema inicial que yo planteaba era: que si intentamos acceder a un indice superior de esa cadena, fpc no se queja y compila sin problemas. Mostrando lo que en esa posición de memoria haya.

Esto en una situacion real puede ser muy negativo.

Igualmente pienso, que esto es un bug.

Saludos.

Fred vS

  • Hero Member
  • *****
  • Posts: 3168
    • StrumPract is the musicians best friend
Re: Limite String
« Reply #23 on: September 09, 2022, 03:19:07 pm »
@Juan:

Como dices, es un poco raro no tener un "crash" durante la ejecución con este:
.
Code: Pascal  [Select][+][-]
  1.   program cadena;
  2.    {$mode objfpc}{$H+}
  3.         var
  4.        frase: string = 'Hola';
  5.     begin
  6.         writeln((high(frase)));
  7.         writeln(frase[30]);  // Aqui NO WARNING, NO CRASH
  8.     end.
  9.  
« Last Edit: September 09, 2022, 03:24:06 pm by Fred vS »
I use Lazarus 2.2.0 32/64 and FPC 3.2.2 32/64 on Debian 11 64 bit, Windows 10, Windows 7 32/64, Windows XP 32,  FreeBSD 64.
Widgetset: fpGUI, MSEgui, Win32, GTK2, Qt.

https://github.com/fredvs
https://gitlab.com/fredvs
https://codeberg.org/fredvs

JuanCP

  • New Member
  • *
  • Posts: 14
Re: Limite String
« Reply #24 on: September 09, 2022, 03:21:48 pm »
Me corrijo a mi mismo, si utilizamos las directivas {$H+}{$R+} funciona de la forma esperada, generando un error en tiempo de compilacion.

De todas formas, creo que el control tendria que ser automatico por parte del compilador si necesidad de incluir directivas.

Saludos.

KodeZwerg

  • Hero Member
  • *****
  • Posts: 2065
  • Fifty shades of code.
    • Delphi & FreePascal
Re: Limite String
« Reply #25 on: September 09, 2022, 03:26:09 pm »
paweld, de acuerdo aplicando la directiva {$H+} conseguimos que fpc nos devuelva la longitud real de la cadena.
Pero, el problema inicial que yo planteaba era: que si intentamos acceder a un indice superior de esa cadena, fpc no se queja y compila sin problemas. Mostrando lo que en esa posición de memoria haya.

Esto en una situacion real puede ser muy negativo.

Igualmente pienso, que esto es un bug.

Saludos.
Quote
paweld, ok by applying the {$H+} directive we get fpc to return the actual length of the string.
But, the initial problem that I raised was: that if we try to access a higher index of that chain, fpc does not complain and compiles without problems. Showing what is in that memory position.

This in a real situation can be very negative.

I also think that this is a bug.

i would like to pick up on this:
Quote
if we try to access a higher index of that chain, fpc does not complain and compiles without problems

1. Why in the world you try to access outside at all ???
2. fpc can not know at compile how small or large your string is.

Conclusion:
Use FPC functions to ensure that what you try to do is doable!
Accessing outside will give back whatever on that memory location is = garbage.

Solution:
Code: Pascal  [Select][+][-]
  1. if Length(MyString) >= Integer(123) then
  2.   WriteLn(MyString[123]);
  3.  

As always, you as the programmer need to take care about what you are doing, the compiler is not able to do every little thing for you.
« Last Edit: Tomorrow at 31:76:97 xm by KodeZwerg »

Fred vS

  • Hero Member
  • *****
  • Posts: 3168
    • StrumPract is the musicians best friend
Re: Limite String
« Reply #26 on: September 09, 2022, 03:27:58 pm »
Me corrijo a mi mismo, si utilizamos las directivas {$H+}{$R+} funciona de la forma esperada, generando un error en tiempo de compilacion.

Con mi ejemplo anterior, no error en tiempo de compilacion:
Code: Bash  [Select][+][-]
  1. fred@fred-80m0 ~> fpc cadena.pas
  2. Free Pascal Compiler version 3.2.2 [2021/05/16] for x86_64
  3. Copyright (c) 1993-2021 by Florian Klaempfl and others
  4. Target OS: Linux for x86-64
  5. Compiling cadena.pas
  6. Linking cadena
  7. 7 lines compiled, 0.2 sec
I use Lazarus 2.2.0 32/64 and FPC 3.2.2 32/64 on Debian 11 64 bit, Windows 10, Windows 7 32/64, Windows XP 32,  FreeBSD 64.
Widgetset: fpGUI, MSEgui, Win32, GTK2, Qt.

https://github.com/fredvs
https://gitlab.com/fredvs
https://codeberg.org/fredvs

Fred vS

  • Hero Member
  • *****
  • Posts: 3168
    • StrumPract is the musicians best friend
Re: Limite String
« Reply #27 on: September 09, 2022, 03:33:09 pm »
2. fpc can not know at compile how small or large your string is.

Code: Pascal  [Select][+][-]
  1. frase := 'Esto es una prueba';
or
Code: Pascal  [Select][+][-]
  1. frase: string = 'Esto es una prueba';

I use Lazarus 2.2.0 32/64 and FPC 3.2.2 32/64 on Debian 11 64 bit, Windows 10, Windows 7 32/64, Windows XP 32,  FreeBSD 64.
Widgetset: fpGUI, MSEgui, Win32, GTK2, Qt.

https://github.com/fredvs
https://gitlab.com/fredvs
https://codeberg.org/fredvs

KodeZwerg

  • Hero Member
  • *****
  • Posts: 2065
  • Fifty shades of code.
    • Delphi & FreePascal
Re: Limite String
« Reply #28 on: September 09, 2022, 03:40:20 pm »
Just to demonstrate your doing differently explained:
Code: Pascal  [Select][+][-]
  1. program Project1;
  2.  
  3. uses
  4.   Classes;
  5.  
  6. {$R *.res}
  7.  
  8. var
  9.   sl: TStringList;
  10.   s: string;
  11. begin
  12.   sl := TStringList.Create;
  13.   s := sl.Strings[123];
  14.   WriteLn(s);
  15.   ReadLn;
  16. end.
It compile perfect, no hint no warning to nothing.
Why?
Because you as the programmer are responsible on what you do.

(And of course we get an access violation, at least on my windows)
« Last Edit: Tomorrow at 31:76:97 xm by KodeZwerg »

JuanCP

  • New Member
  • *
  • Posts: 14
Re: Limite String
« Reply #29 on: September 09, 2022, 03:46:43 pm »
KodeZwerg.

Remember, everything bad that can happen will happen. murphi's law.

java and python don't have this problem, for example.

 

TinyPortal © 2005-2018