Recent

Author Topic: Limite String  (Read 6966 times)

Fred vS

  • Hero Member
  • *****
  • Posts: 3158
    • StrumPract is the musicians best friend
Re: Limite String
« Reply #45 on: September 10, 2022, 01:14:28 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 !!.

Todo esto lo puedo entender.

Pero eso high(astring) = length(astring) es muy difícil para mí de entender   :(

[EDIT] Creo que voy a hacer como Juan: correr lo más rápido posible, me doy por vencido... :-X
« Last Edit: September 10, 2022, 01:42:33 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

paweld

  • Hero Member
  • *****
  • Posts: 970
Re: Limite String
« Reply #46 on: September 10, 2022, 10:54:49 am »
@Fred vS:
Una cadena en Pascal está indexada desde 1, a diferencia de otras matrices indexadas desde 0.
Para ShortString, la longitud de la cadena se almacena en el índice 0, por lo que High(stringVar) = Length(stringVar)
 
Más información:
https://wiki.freepascal.org/Character_and_string_types#ShortString
https://www.freepascal.org/docs-html/ref/refsu9.html
« Last Edit: September 10, 2022, 10:56:34 am by paweld »
Best regards / Pozdrawiam
paweld

JuanCP

  • New Member
  • *
  • Posts: 14
Re: Limite String
« Reply #47 on: September 10, 2022, 11:00:45 am »
Buenos días a Todos.

Hola mosquito, estoy totalmente atento, pero hay cosas y conceptos que me superan y prefiero estar expectante.

Gracias a los que hacéis este foro.

Saludos.

Fred vS

  • Hero Member
  • *****
  • Posts: 3158
    • StrumPract is the musicians best friend
Re: Limite String
« Reply #48 on: September 10, 2022, 01:44:29 pm »
@Fred vS:
Una cadena en Pascal está indexada desde 1, a diferencia de otras matrices indexadas desde 0.
Para ShortString, la longitud de la cadena se almacena en el índice 0, por lo que High(stringVar) = Length(stringVar)
 
Más información:
https://wiki.freepascal.org/Character_and_string_types#ShortString
https://www.freepascal.org/docs-html/ref/refsu9.html


Hola paweld.
Eres la luz en una jungla en la noche.
Entendido, el primer índice low(astring) = 1 con ansistring.

Code: Pascal  [Select][+][-]
  1.   program cadena;
  2. {$mode objfpc}{$H+}
  3. var
  4.   Frase: String;
  5. begin
  6.   Frase := 'Esto es una prueba';
  7.   WriteLn(low(Frase)); //Devuelve 1 con H+
  8.   WriteLn(High(Frase)); //Devuelve 18 con H+
  9.   WriteLn(Length(Frase)); //Siempre devuelve 18
  10.   Readln()
  11. end.

--->

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

Ya no tengo que entender por qué, con {$H-} = shortstring,, obtuve esto como resultado ( high(frase) = 255 en lugar de 17)

Code: Pascal  [Select][+][-]
  1. fred@fred-80m0 ~> ./cadena
  2. 0
  3. 255
  4. 18


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 #49 on: September 10, 2022, 02:02:09 pm »
@Fred vS:
Una cadena en Pascal está indexada desde 1, a diferencia de otras matrices indexadas desde 0.
Para ShortString, la longitud de la cadena se almacena en el índice 0, por lo que High(stringVar) = Length(stringVar)
 
Más información:
https://wiki.freepascal.org/Character_and_string_types#ShortString
https://www.freepascal.org/docs-html/ref/refsu9.html

Hola, yo creo que lo tengo claro.Tal como comenta Paweld. ShorString es un array de 255 elementos, por eso High devuelve 255, porque es el número tamaño que tiene ese array. Otra cosa es cuantos elementos "no cero" tenemos en él.

La directiva $H, indica como se van a tratar las cadenas https://wiki.freepascal.org/$H, como shortstring o como string. De ahí las dierencias entre usar un sistema u otro.

Saludos

/BlueIcaro

Fred vS

  • Hero Member
  • *****
  • Posts: 3158
    • StrumPract is the musicians best friend
Re: Limite String
« Reply #50 on: September 10, 2022, 02:46:01 pm »
@BlueIcaro.

También me queda claro todo aparte de la relación entre high(ashortstring) y length(ashortstring)

Si length(ashortstring) = 18 y low(ashortstring) = 0 entonces high(ashortstring) debe ser igual a 17.

¿No?
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: 3158
    • StrumPract is the musicians best friend
Re: Limite String
« Reply #51 on: September 10, 2022, 03:05:43 pm »
Para ShortString, la longitud de la cadena se almacena en el índice 0, por lo que High(stringVar) = Length(stringVar)

Lo siento, soy yo otra vez...
Entonces, si la cadena es ansistring y low(stringVar) = 1 entonces High(stringVar) = Length(stringVar).

OK.

Pero, como usted indica con shortstring:
Quote
Para ShortString, la longitud de la cadena se almacena en el índice 0, por lo que High(stringVar) = Length(stringVar)

no debería ser, si low(stringVar) = 0:
High(stringVar) = Length(stringVar) -1

?¿

[EDIT]
Bien aquí:
https://forum.lazarus.freepascal.org/index.php/topic,60528.msg452961.html#msg452961
« Last Edit: September 10, 2022, 04:06:31 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: 3158
    • StrumPract is the musicians best friend
Re: Limite String
« Reply #52 on: September 11, 2022, 03:05:38 pm »
Hola Juan.

Gran pelea sobre tu tema en el foro de ingles:
https://forum.lazarus.freepascal.org/index.php/topic,60528.msg452961.html#msg452961

Como podéis ver, mucha gente hablando de sus medallas, o nuevos conversos furiosos que tengo dudas sobre el funcionamiento de su Santo-fpc.

Mi conclusión es que si no hay un mensaje de "warning" si como lo hacen Delphi y Java es un bug (que creo que encontré).
(Y ahora estarán todos los giris/gringos nuevos conversos que dirán que no entiendo na y que me tienen que quemar).

Fre;D
« Last Edit: September 11, 2022, 04:50:19 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: 2007
  • Fifty shades of code.
    • Delphi & FreePascal
Re: Limite String
« Reply #53 on: September 11, 2022, 03:51:22 pm »
¿Cómo puede ser un error cuando está absolutamente y claramente descrito en las instrucciones?
https://wiki.lazarus.freepascal.org/Shortstring
Quote
Advertencia: low(myShortString) devuelve 0, el índice del byte de longitud, no el índice del primer carácter. De manera similar, high(myShortString) siempre devuelve 255. En su lugar, -> USAR LENGTH <-.
Seamos objetivos y no comparemos manzanas con naranjas.
Te respeto y entiendo que estés completamente horrorizado de que FPC no funcione como Java o algo así.
No te molestaré más aquí, diviértete con todos los lenguajes de programación :)
Traducido con Google, perdón por las faltas de ortografía!
« Last Edit: Tomorrow at 31:76:97 xm by KodeZwerg »

BlueIcaro

  • Hero Member
  • *****
  • Posts: 792
    • Blog personal
Re: Limite String
« Reply #54 on: September 12, 2022, 11:32:40 am »
¿Cómo puede ser un error cuando está absolutamente y claramente descrito en las instrucciones?
https://wiki.lazarus.freepascal.org/Shortstring
Quote
Advertencia: low(myShortString) devuelve 0, el índice del byte de longitud, no el índice del primer carácter. De manera similar, high(myShortString) siempre devuelve 255. En su lugar, -> USAR LENGTH <-.
Seamos objetivos y no comparemos manzanas con naranjas.
Te respeto y entiendo que estés completamente horrorizado de que FPC no funcione como Java o algo así.
No te molestaré más aquí, diviértete con todos los lenguajes de programación :)
Traducido con Google, perdón por las faltas de ortografía!

Estoy de acuerdo contigo. Para mi no hay discusión. Se usa lenght con Cadenas, tal como comenté en un post anterior. Este método es el indicado para obtener su longuitud, de acuerdo con la ayuda de FPC.

Cada lenguaje tiene "cosas", o características. Si en un lenguaje determinado, no hay este "problema", pues estupendo. Pero en FPC no hay problema tampoco. Se debe usar el método que indica la ayuda. En este caso Lenght.

Si usas otros métodos, que no son los indicados, no es "responsabilidad" o "bug" del lenguaje.   Es como el que tiene un coche y siempre empieza a moverse en la 2 ó 3 marcha, en lugar de usar la primer marcha. Claro que el coche se mueve. Pero los problemas o incidencias que puedan haber no son fallo de diseño, ya que el fabricante dice que se debe empezar en la primera marcha.
Si uno usa correctamente lo que dice el fabricante y no funciona, entonces si podemos hablar de bug, errores de documentación, etc..

Saludos

/BlueIcaro

Fred vS

  • Hero Member
  • *****
  • Posts: 3158
    • StrumPract is the musicians best friend
Re: Limite String
« Reply #55 on: September 12, 2022, 12:50:03 pm »
Se usa lenght con Cadenas, tal como comenté en un post anterior. Este método es el indicado para obtener su longuitud, de acuerdo con la ayuda de FPC.

Está bien, pero eso no responde a la pregunta original de Juan.

Y no entiendo por qué la razón es que el compilador no tiene indicación para obtener la longuitud de la cadena.

Para mi tiene la indicación del longuitud con este:

Code: Pascal  [Select][+][-]
  1. var
  2.     Frase: String = 'Esto es una prueba';

Tal vez me equivoque, si la cadena se ha inicializado, el compilador no puede saber su longitud, pero cada vez que hice la pregunta, no hubo respuesta.
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: 3158
    • StrumPract is the musicians best friend
Re: Limite String
« Reply #56 on: September 12, 2022, 02:25:09 pm »
Ha, parece que el Google-translate ha funcionado para el foro en inglés  ;D
https://forum.lazarus.freepascal.org/index.php/topic,60528.msg453208.html#msg453208

Así que rectifico: esto no es un bug sino una característica que aún no se ha implementado y que puede que nunca se implemente.

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

JuanCP

  • New Member
  • *
  • Posts: 14
Re: Limite String
« Reply #57 on: September 12, 2022, 06:42:59 pm »
Buenas Tardes a todos.

El poner otros compiladores, fue simplemente por establecer una comparacion, nada mas. Siento si alguien se ha ofendido.

En cuanto al funcionamiento interno del compilador, pienso exactamente igual que @Fred vS, Cuando declaras la variable y la inicializas con un valor eso debería ser suficiente para tener el control por parte del compilador, sobre todo, si tenemos en cuenta que FP trata los string como arrays de char.

Me parece arriesgado cargar sobre el programador el control de las cadenas y el control de los limites de los arrays con directivas como: {$H+}{$R+}.

Siguiendo con las pruebas, adjunto 2 imágenes del código compilado con otro compilador de pascal (se dice que es un clon de turbo pascal), se llama Modern Pascal, el compilador tiene ya unos 3 años pero el proyecto esta muy vivo.

Podréis comprobar que si intentamos acceder a una posición mas allá de la longitud de la cadena da error de acceso.

Pienso, desde mi humilde opinión que este tipo de cosas se deberían de revisar por parte del equipo de fp.

Saludos  a todos

Fred vS

  • Hero Member
  • *****
  • Posts: 3158
    • StrumPract is the musicians best friend
Re: Limite String
« Reply #58 on: September 12, 2022, 06:52:03 pm »
El poner otros compiladores, fue simplemente por establecer una comparacion, nada mas. Siento si alguien se ha ofendido.
¡Yo no de todos modos!
Pero parece que la comparación con Delphi da el mismo resultado que fpc.

Quote
Cuando declaras la variable y la inicializas con un valor eso debería ser suficiente para tener el control por parte del compilador, sobre todo, si tenemos en cuenta que FP trata los string como arrays de char.
Para otros compiladores es muy posible pero para Delphi y fpc los gurús dicen que no (o con mucho trabajo no quieren hacer).
https://forum.lazarus.freepascal.org/index.php/topic,60528.msg453208.html#msg453208
« Last Edit: September 12, 2022, 07:22:17 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

 

TinyPortal © 2005-2018