Recent

Author Topic: Limite String  (Read 7039 times)

JuanCP

  • New Member
  • *
  • Posts: 14
Limite String
« on: September 08, 2022, 07:53:49 pm »
Un saludo a todos.

Siguiendo con mis practicas de FP me he encontrado con una situación que no se resolver.

program cadena;

{$MODE CONSOLE}
{$R+}

var
   frase: string;

begin
   frase := 'Esto es una prueba';
   writeln(frase);
   writeln(frase[30]);
end.


La variable frase tiene una longitud de 17 caracteres.

Si intento imprimir el nº 30, por ejemplo, el compilador no lanza ningún error o advertencia y ejecuta el programa sin problemas.

Tanto delphi, Java o Python dan error al intentar acceder a un elemento mayor.

Gracias de antemano

KodeZwerg

  • Hero Member
  • *****
  • Posts: 2068
  • Fifty shades of code.
    • Delphi & FreePascal
Re: Limite String
« Reply #1 on: September 08, 2022, 08:32:34 pm »
I do not know what you are writing but your code produce an access violation.
with "writeln(frase[30]);" you try to access string position #30 what does not exist.
If you want a fixed length string you can do:
Code: Pascal  [Select][+][-]
  1. program cadena;
  2.  
  3. {$MODE CONSOLE}
  4. {$R+}
  5.  
  6. var
  7.    frase: string[30];
  8. begin
  9.    frase := 'Esto es una prueba';
  10.    writeln(frase);
  11.    writeln(frase[30]);
  12. end.
« 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 #2 on: September 08, 2022, 09:16:14 pm »
Si intento imprimir el nº 30, por ejemplo, el compilador no lanza ningún error o advertencia y ejecuta el programa sin problemas.

Tanto delphi, Java o Python dan error al intentar acceder a un elemento mayor.

Gracias de antemano

Hola!

No sé sobre Delphi pero esto:

Code: Pascal  [Select][+][-]
  1.   program cadena;
  2.     var
  3.        frase: string[16];
  4.     begin
  5.        frase := 'Esto es una prueba';
  6.        writeln(frase);
  7.        writeln(frase[30]);
  8.     end.
  9.  

da esto en tiempo de compilació.

Quote
fred@fred-80m0 ~ [1]> fpc cadena.pas
Free Pascal Compiler version 3.2.2 [2021/07/09] for x86_64
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling cadena.pas
cadena.pas(6,14) Warning: String literal has more characters than short string length
cadena.pas(8,22) Warning: range check error while evaluating constants (30 must be between 0 and 13)
Linking cadena
8 lines compiled, 0.5 sec
2 warning(s) issued
fred@fred-80m0 ~>
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 #3 on: September 08, 2022, 09:21:37 pm »
Re-holla!

Pero sí, eso no siempre funciona... :-[

Esto:
Code: Pascal  [Select][+][-]
  1.   program cadena;
  2.      
  3.      var
  4.        frase: string = 'Esto es una prueba';
  5.     begin
  6.        writeln(frase);
  7.        writeln(frase[30]);
  8.     end.

Da esto sin "warning":

Quote
fred@fred-80m0 ~> fpc cadena.pas
Free Pascal Compiler version 3.2.2 [2021/07/09] for x86_64
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling cadena.pas
Linking cadena
7 lines compiled, 0.2 sec



« Last Edit: September 08, 2022, 09:29:20 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 #4 on: September 08, 2022, 09:32:34 pm »
Compiled with FP on sublime_text on no time I have   error of acces violation.

The second image is the result of a index correct

KodeZwerg

  • Hero Member
  • *****
  • Posts: 2068
  • Fifty shades of code.
    • Delphi & FreePascal
Re: Limite String
« Reply #5 on: September 08, 2022, 09:44:47 pm »
This is what happen on my Windows machine.
« Last Edit: Tomorrow at 31:76:97 xm by KodeZwerg »

JuanCP

  • New Member
  • *
  • Posts: 14
Re: Limite String
« Reply #6 on: September 08, 2022, 09:45:11 pm »
Hola de nuevo.

Ya se porque pasa esto.

como la longitud maxima del String es de 255 Caracteres, al no establecer la logitud de la cadena al declarar la variable, la logitud se toma al valor maximo por defecto.
Si intentamos acceder a un indice mayor de 255, dará error.

mosquito

  • Full Member
  • ***
  • Posts: 141
Re: Limite String
« Reply #7 on: September 08, 2022, 09:48:45 pm »
Hola Juan,


1. Lo de MODE CONSOLE Y R+ no creo que sea muy recomendable. Quizás sería mejor empezar con algo como ...


Code: Pascal  [Select][+][-]
  1.  
  2.  
  3. PROGRAM TEST;
  4.  
  5.  
  6. {$MODE OBJFPC}{$H+}{J-}{R+}
  7. {$APPTYPE CONSOLE}
  8.  
  9.  
  10. USES
  11.   {$IFDEF UNIX}
  12.   CTHREADS,
  13.   {$ENDIF}
  14.   CLASSES, SYSUTILS ;
  15.  
  16.  
  17. ...
  18.  
  19.  
  20.  


2. Usar "string" está bien para hacer pruebas rápidas, pero no es muy aconsejable. De hecho "string" no es un tipo. Según qué plataforma uses, a qué plataformas vayas s compilar y que directivas de compilación tengas o no tengas, "string" significará cosas diferentes, algunas de ellas con resultados inesperados y sorprendentes.


String es sólo un alias. Mejor usar tipos unequívocos (ShortString, AnsiString, WideString o UnicodeString).


Como no has indicado ningún modo de compatibilidad ni has especificado ninguna directiva de compilación referente al uso de "cadenas", el compilador ha decidido por si mismo ponerse en {$MODE FPC} donde una "string" es realmente un tipo "ShortString" con un límite de 255. Podrás juguetear sin recibir errores (o no) mientras no intentes acceder una posición mayor de 254.
« Last Edit: September 09, 2022, 11:00:37 pm by mosquito »

Fred vS

  • Hero Member
  • *****
  • Posts: 3168
    • StrumPract is the musicians best friend
Re: Limite String
« Reply #8 on: September 08, 2022, 09:54:15 pm »
Hola de nuevo.

Ya se porque pasa esto.

como la longitud maxima del String es de 255 Caracteres, al no establecer la logitud de la cadena al declarar la variable, la logitud se toma al valor maximo por defecto.
Si intentamos acceder a un indice mayor de 255, dará error.

Si pero me parece que si lo haces:

Code: Pascal  [Select][+][-]
  1. var
  2.        frase: string = 'Esto es una prueba';
  3.     begin
  4.        writeln(frase);
  5.        writeln(frase[30]);
  6. end;

podría tener una advertencia.
(Pero me parece  ser un detalle (o no...))

[EDIT] No, high(frase) es 255, incluso si se inicializa con frase: string = 'Esto es una prueba';
Entonces todo parece lógico.

« Last Edit: September 08, 2022, 10:12:43 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 #9 on: September 08, 2022, 09:59:04 pm »
[ :P ] Y mira que refresqué antes de lanzar la respuesta. Me ganaste por 3 segundos.

[ ;)  ] Ya veo que ves por donde vienen los tiros.
« Last Edit: September 08, 2022, 10:00:37 pm by mosquito »

Fred vS

  • Hero Member
  • *****
  • Posts: 3168
    • StrumPract is the musicians best friend
Re: Limite String
« Reply #10 on: September 08, 2022, 10:07:04 pm »
Ay, otra vez me pica un mosquito antes de verlo!  ;)
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 #11 on: September 08, 2022, 10:26:46 pm »
@JuanCP:

¿Estás seguro de que con Delphi:

Code: Pascal  [Select][+][-]
  1. var
  2.    frase: string;

la logitud por defecto no es la longitud máxima (no tengo Delphi)?
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 #12 on: September 08, 2022, 10:32:52 pm »
Con fpc:
 
Code: Pascal  [Select][+][-]
  1.  program cadena;
  2.         var
  3.        frase: string;
  4.     begin
  5.        writeln((high(frase)));
  6.      end.

esto da: 255

¿Qué da Delphi?
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: 2068
  • Fifty shades of code.
    • Delphi & FreePascal
Re: Limite String
« Reply #13 on: September 09, 2022, 01:03:29 am »
Con fpc:
 
Code: Pascal  [Select][+][-]
  1.  program cadena;
  2.         var
  3.        frase: string;
  4.     begin
  5.        writeln((high(frase)));
  6.      end.

esto da: 255

¿Qué da Delphi?
« 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 #14 on: September 09, 2022, 03:29:50 am »
@KodeZwerg
Si aún tiene abierto su proyecto Delphi, intente esto, por favor:

Translated:
If you have still your Delphi project open, could you, please try this:

 
Code: Pascal  [Select][+][-]
  1. s: string = 'This is a test';
  2.     begin
  3.        writeln((high(s)));

Con fpc obtengo: 255

Trans:
With fpc I get: 255
« Last Edit: September 09, 2022, 03:49:07 am 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

 

TinyPortal © 2005-2018