Recent

Author Topic: Limite String  (Read 7004 times)

Fred vS

  • Hero Member
  • *****
  • Posts: 3168
    • StrumPract is the musicians best friend
Re: Limite String
« Reply #30 on: September 09, 2022, 03:48:26 pm »
Because you as the programmer are responsible on what you do.

Yes Sir, I will do it Sir.

But if fpc has the features to show warnings and hints, and if some other compilers, that also have those features and can warn in such situation, it could be interesting to note it, like Juan did.
« Last Edit: September 09, 2022, 03:50:54 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

KodeZwerg

  • Hero Member
  • *****
  • Posts: 2050
  • Fifty shades of code.
    • Delphi & FreePascal
Re: Limite String
« Reply #31 on: September 09, 2022, 03:59:10 pm »
KodeZwerg.

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

java and python don't have this problem, for example.
I agree to Murphy  :D

What other (script) languages do, i would never compare. Each "thing" goes its own way to handle situations differently.
Because you as the programmer are responsible on what you do.

Yes Sir, I will do it Sir.

But if fpc has the features to show warnings and hints, and if some other compilers, that also have those features and can warn in such situation, it could be interesting to note it, like Juan did.
I agree that other compilers (c++, c#, basic, asm etc...) are working differently.
For that purpose the makers gave us a manual on how it works.
« Last Edit: Tomorrow at 31:76:97 xm by KodeZwerg »

mosquito

  • Full Member
  • ***
  • Posts: 141
Re: Limite String
« Reply #32 on: September 09, 2022, 06:06:32 pm »
Siento ser pesado y repetitivo, pero como ya comenté anteriormente este es el funcionamiento normal de 'string'. El manual del programador ya advierte esto. Es el resultado de usar un alias a las bravas. String NO ES UN TIPO. Y el compilador decide que tipo le asigna a 'string', salvo que al programador le importe y se lo diga previamente.


Por otro lado lo del peligro ... no lo veo. El usuario podrá hacer algo peligroso si el programador le deja hacerlo, como en cualquier lenguaje. Por no hablar de que no se está limitando de ninguna forma la cadena. Con lo cual en ciertos casos el límite será sólo el de la memoria RAM. Para más inri, estamos presentando ejemplos con MODES distintos, directivas distintas y en plataformas distintas. Sin contar con que Lazarus no trata 'string' igual que FPC + Sublime. Lazarus siempre hace conversión interna de 'string' (si no se le dice lo contrario). La variable tendrá más bytes que caracteres !!


En el ejemplo adjunto, si nos ponemos a descomentar y comentar, exceptuando el caso de ShortSrting (que debe cascar siempre y donde sea), los demás accesos aleatorios a posiciones de estos tipos tendrán resultados diferentes para cada usuario, dependiendo de su plataforma, MODES, directivas y el uso de Lazarus o no. En la mayoría de los casos compilará y devolverá resultados imprevisibles o simplemente datos que estén actualmente en esas posiciones de memoria.


Realmente sigo sin ver el bug o el problema. Si FRASE := 'Prólogo' y unos segundos después quieres que FRASE sea igual a 5Mb de texto ... que se supone que debes protegerte a ti mismo de no hacerlo, o andar seteando lengths como con los arrays viejunos?. Para eso hay tipos más estrictos y límites. Creo que esta obsesión 'de acceso' tiene sentido en un array de records, por ejemplo, pero no aquí.


Por supuesto todo esto es sólo mi opinión personal, quizás esté equivocado. Yo también soy novato.
« Last Edit: September 09, 2022, 06:41:06 pm by mosquito »

Fred vS

  • Hero Member
  • *****
  • Posts: 3168
    • StrumPract is the musicians best friend
Re: Limite String
« Reply #33 on: September 09, 2022, 07:16:34 pm »
@mosquto: Ok, esto no es un bug sino más bien un comentario.
Entonces, para continuar el juego...

Según esto: https://wiki.freepascal.org/String

 con {$mode objfpc}{$H+} usamos alias String para AnsiString

Y cuando hace esto, no hay ningún error o mensaje en el tiempo de compilación y no hay fallas en el tiempo de ejecución:
 
Code: Pascal  [Select][+][-]
  1.    program cadena;
  2.    {$mode objfpc}{$H+}
  3.         var
  4.        frase: ansistring = 'Hola';
  5.     begin
  6.         writeln((high(frase)));
  7.         writeln(frase[30]);
  8.     end.

Eso no es gran cosa, pero es bueno saberlo.
« Last Edit: September 09, 2022, 07:18:53 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 #34 on: September 09, 2022, 07:28:20 pm »
Hola mosquito.

Bueno,  al fin y al cabo muchos de los que estáis aquí sois profesionales en esto de la programación, yo solo un aficionado.

No intento comparar lenguajes de programación, cada uno es como es y todos tienen cosas buenas y no tan buenas, pero me llama la atención que pudiendo ser mas fácil el control de un array,  fpc, desde mi punto de vista lo complica.


Gracias y saludos a todos.

mosquito

  • Full Member
  • ***
  • Posts: 141
Re: Limite String
« Reply #35 on: September 09, 2022, 10:05:25 pm »
@JuanCP
La pregunta que has planteado me parece muy interesante y denota interés por tu parte. Incluso verás en el foro que los propios desarrolladores del compilador a veces se hacen preguntas sobre el funcionamiento del mismo. Es algo normal. Sólo te puedo recomendar que sigas con empeño y revientes el foro a preguntas.


Sin embargo la conclusión a la que has llegado ... 'FPC complica el control de los Arrays', yo no lo veo así. Es cierto que en este caso el compilador se comporta de una forma poco convencional, pero se preserva con absoluto rigor la integridad de los datos y por supuesto puedes recorrer el contenido de cualquier Array en FPC con total seguridad. No soy un fanático ni un predicador de Pascal, pero se que los supercomputadores de cálculo del planeta (que corren sobre Linux el 99%), trabajan con C, Pascal y FORTRAN todavía por algo. Te puedo asegurar que trabajar con Arrays de forma intensiva es totalmente segura.


@Fred


Si lo haces así no obtendrás ni warnings ni errores de compilación.


Si lo haces con "FRASE : STRING[14]", tendrás warnings. Uno al inicializar la variable, donde se nos dice que estamos metiendo mas datos de los que soporta la cadena. Y por cada intento de acceso a posiciones superiores obtendremos mas warnings. No hay error de compilación pero se protege totalmente el bound,  hay integridad en los datos y en el tamaño de la asignación.
¿debería fallar la compilación? Pues yo no soy quien para decirlo.


@JuanCP, @Fred
Mira este caso todavía más transgresivo ... podríamos asumir por la misma regla de 3, que no sólo hay un bug en la lectura sino que además podemos escribir por encima del bound del Array, Oh Dios mio !

Code: Pascal  [Select][+][-]
  1. PROGRAM TEST ;
  2. {$MODE OBJFPC}
  3. {$LONGSTRINGS OFF}
  4. {$J-}
  5.  
  6.  
  7. USES
  8. CLASSES, SYSUTILS  ;
  9.  
  10.  
  11. VAR
  12. FRASE : ARRAY[1..4] OF CHAR  ;
  13.  
  14.  
  15. BEGIN
  16. FRASE := 'HOLA'  ;
  17. WRITELN(INTTOSTR(HIGH(FRASE))) ;
  18. WRITELN(INTTOSTR(LENGTH(FRASE))) ;
  19. FRASE[6]:='J' ;
  20. WRITELN(FRASE[6]) ;
  21. WRITELN(INTTOSTR(HIGH(FRASE)))  ;
  22. WRITELN(INTTOSTR(LENGTH(FRASE))) ;
  23. END.
  24.  
  25.  
  26. // OUTPUT
  27. // 4
  28. // 4
  29. // J
  30. // 4
  31. // 4  
  32.  
  33.  

Entonces yo lo veo así:


1. le he dado instrucciones al compilador para evitar cadenas de más 255. Un usuario no podrá crearme un overflow, y no he tenido siquiera que sanitizar mi código. Per es más, se que no podrá, ni podré superar el límite de 4 mientras no cambie su 'length'.


2. Dónde se escribió la J y por qué puedo recuperarla ?
   Por qué la J se escribió allí y no en otro lugar ?
   Por qué compila ?
   No tengo esos conocimientos y tampoco me importa mucho, pero vuelvo a la tranquilidad de ver que mis datos siguen intactos y mi HIGH(FRASE) y mi LENGTH(FRASE) siguen intactos.


3. Lo que si que me importa es tener todo un abanico de tipos para controlar mi cadena y lo que puedo hacer y no con ella. (no fuera de ella). Por eso creo que es importante usar 'string' sólo si se le dijo al compilador antes, que hacer con este alias.
« Last Edit: September 09, 2022, 11:30:11 pm by mosquito »

Fred vS

  • Hero Member
  • *****
  • Posts: 3168
    • StrumPract is the musicians best friend
Re: Limite String
« Reply #36 on: September 09, 2022, 10:21:51 pm »
@Fred

Quote
Si lo haces así no obtendrás ni warnings ni errores de compilación.


Si lo haces con "FRASE : STRING[14]", tendrás warnings.

Ya hablamos de ello aquí:  ;):
https://forum.lazarus.freepascal.org/index.php/topic,60504.msg452740.html#msg452740

Pero esa no era la pregunta y de todos modos no es muy importante.

Paz y nunca dudes en explorar, probar y verificar.

Fre;D

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

BlueIcaro

  • Hero Member
  • *****
  • Posts: 792
    • Blog personal
Re: Limite String
« Reply #37 on: September 09, 2022, 11:07:57 pm »
Hola, me llamó la atención que usaras HIGH para obtener la longuitud de la cadena.

Yo siempré use Length, Así que probé el siguiente código:
Code: [Select]
program Project1;
{$mode objfpc}{$H-}
var
  Frase: String;
begin
  Frase := 'Esto es una prueba';
  WriteLn(High(Frase)); //Devuelve 255 con H-
  WriteLn(Length(Frase)); //Siempre devuelve 18
  Readln()
end.
           
Y si usas Lenght no tienes ningún problema, siempre devuelve 18.
Leyendo la ayuda que sale cuando pulsas F1 en Lazarus, dice sobre HIGH:
Quote
Return highest index of open array or enumerated
En español, dice que devuelve el indice más alto de un array abierto o enumerado.
Hasta dónde yo se (creo haber leido) las cadenas en pascal, no son un array como tal.  Aunque se pueden pueden acceder por indice. Creo que lei que en Delphi que la posición 0 indica la longuitud, ya que no se usa el sistema de C, que son arrays y el ultimo elemento es null.
De todas maneras, si lees la ayuda sobre Lenght, dice:
Quote
Returns length of a string or array.

En Español: Devuevle la longitud de una cadena o array.
Por tanto creo que la forma correcta es usar Lenght.

Las pruebas las hice en W11. Lazarus 2.2.2. Fpc 3.2.2

Saludos

/BlueIcaro

Fred vS

  • Hero Member
  • *****
  • Posts: 3168
    • StrumPract is the musicians best friend
Re: Limite String
« Reply #38 on: September 09, 2022, 11:29:04 pm »
Hola, me llamó la atención que usaras HIGH para obtener la longuitud de la cadena.

Yo siempré use Length, Así que probé el siguiente código:
Code: [Select]
program Project1;
{$mode objfpc}{$H-}
var
  Frase: String;
begin
  Frase := 'Esto es una prueba';
  WriteLn(High(Frase)); //Devuelve 255 con H-
  WriteLn(Length(Frase)); //Siempre devuelve 18
  Readln()
end.
           

Ja, de hecho con {$H-}:
Code: Bash  [Select][+][-]
  1. fred@fred-80m0 ~> ./Project1
  2. 255
  3. 18

Pero con {$H+}
Code: Bash  [Select][+][-]
  1. fred@fred-80m0 ~> ./Project1
  2. 18
  3. 18

Mama mia, que complicado  %)
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 #39 on: September 09, 2022, 11:41:44 pm »
También lógicamente High(Frase) debe ser igual a Length(Frase) -1

Y aqui los 2 son igual a 18:o

Estoy perdido  :'(
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

mosquito

  • Full Member
  • ***
  • Posts: 141
Re: Limite String
« Reply #40 on: September 09, 2022, 11:48:48 pm »

son longitudes de cosas distintas (variable, cadena, caracteres)


{H+}
var frase : string ;
begin
frase := 'CIGÜEÑÁ';
showmessage(high(frase))); // 10
showmessage(length(frase))); // 10
showmessage(utf8length(frase))); // 7 :)


{H-}
var frase : string ;
begin
frase := 'CIGÜEÑÁ';
showmessage(high(frase))); // 255
showmessage(length(frase))); // 10
showmessage(utf8length(frase))); // 7 :)
« Last Edit: September 10, 2022, 12:58:19 pm by mosquito »

Fred vS

  • Hero Member
  • *****
  • Posts: 3168
    • StrumPract is the musicians best friend
Re: Limite String
« Reply #41 on: September 09, 2022, 11:55:21 pm »
showmessage(high(frase))); // 10
showmessage(length(frase))); // 10

Esto no lo entiendo porque la longitud es igual para high() y length().

high() = length() - 1, ?no¿
« Last Edit: September 09, 2022, 11:57:11 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

mosquito

  • Full Member
  • ***
  • Posts: 141
Re: Limite String
« Reply #42 on: September 10, 2022, 12:00:08 am »
En un array of integer si, aquí rigen otras leyes.
@JuanCP no te vayas corriendo por Dios !!

Fred vS

  • Hero Member
  • *****
  • Posts: 3168
    • StrumPract is the musicians best friend
Re: Limite String
« Reply #43 on: September 10, 2022, 12:12:02 am »
En un array of integer si, aquí rigen otras leyes.

¿Y qué otras leyes?

Code: Pascal  [Select][+][-]
  1.   program cadena2;
  2. {$mode objfpc}{$H+}
  3. var
  4.   arofchar: Array of Char;
  5. begin
  6.    SetLength(arofchar, 5);
  7.   WriteLn(High(arofchar));
  8.   WriteLn(Length(arofchar));
  9.   Readln()
  10. end.

--->

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


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

mosquito

  • Full Member
  • ***
  • Posts: 141
Re: Limite String
« Reply #44 on: September 10, 2022, 12:49:05 am »
Creo que según la conversión de tipo que haga el compilador de 'string', puede haber bytes con información extra.

https://wiki.freepascal.org/Character_and_string_types#Static_Array_of_Char


https://wiki.freepascal.org/Character_and_string_types#String_types

----------------------------------
ShortString
Short strings have a maximum length of 255 characters with the implicit codepage CP_ACP. The length is stored in the character at index 0. A short string of 255 characters uses 256 bytes of memory (one byte for the length specification and 255 bytes for characters).

#3   a   b   c
----------------------------------
Es sólo un ejemplo, cada tipo relacionado con cadenas tiene lo suyo. Pff !!.


« Last Edit: September 10, 2022, 12:55:30 am by mosquito »

 

TinyPortal © 2005-2018